Makefile中常用的一些符号

1 环境变量

1.1 编译器

CC   // C语言编译器,默认值为gcc
CXX  // C++语言编译器,默认值为g++

说明:这是默认的变量,无需用户自定义(但是用户可以修改其值,例如CC=arm-linux-gcc,用于交叉编译)。

1.2 编译器参数

CFLAGS   // C语言编译器的编译选项
LDFLAGS  // C语言编译器的链接选项
CXXFLAGS // C++语言编译器的编译选项

2 自动化变量

$@ 代表规则中的目标文件名。如果目标是一个文档(Linux中,一般称.a文件为文档),那么它代表这个文档的文件名。在多目标的模式规则中,它代表的是哪个触发规则被执行的目标文件名。
$% 规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“$%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是函数库文件,其值为空。
$< 规则的第一个依赖文件名。如果是隐含规则,则它代表通过目标指定的第一个依赖文件。
$? 所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件)的更新情况。
$^ 规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件名,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。
$+ 类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时,库的交叉引用场合。
$(@D) 代表目标文件的目录部分(去掉目录部分的最后一个斜杠)。如果“$@”是“dir/foo.o”,那么“$(@D)”的值为“dir”。如果“$@”不存在斜杠,其值就是“.”(当前目录)。注意它和函数“dir”的区别!
$(@F) 目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“$@”为“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等价于函数“$(notdir $@)”。
$(%D)
$(%F) 当以如“archive(member)”形式静态库为目标时,分别表示库文件成员“member”名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。
$(<D)
$(<F) 分别表示规则中第一个依赖文件的目录部分和文件名部分。
$(^D)
$(^F) 分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。
$(+D)
$(+F) 分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。
$(?D)
$(?F) 分别表示被更新的依赖文件的目录部分和文件部分。

3 通配符
% 是通配符,%.cc表示工程里的.cc文件

4 变量替换
$(VAR:A=B)  同${VAR:A=B}
${VAR:A=B} 替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。“结尾”的含义是空格之前(变量值的多个字以空格分开)

5 赋值
= 当它的右边赋值是变量时,这个变量的定义在本条语句之前或之后都可以,即可以递归展开。
:= 它右边赋得值如果是变量,只能使用在这条语句之前定义好的,而不能使用本条语句之后定义的变量,即不可以递归展开。
?= 该符号左边的变量,如果在本条语句之前没有定义过,则执行本语句,如果已经定义,那么本语句什么都不做。
+= 是添加等号后面的值

6 其他符号
@ 表示在make时不输出make的信息(类似Windows下的echo   off)。


7 关键字/命令
include 在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置
-include 其表示,无论include过程中出现什么错误,都不要报错继续执行。和其它版本make兼容的相关命令是sinclude,其作用和这一个是一样的。
sinclude 同上

8 函数
basename 取变量的前缀部分

参考资料

[1]MakeFile中的变量定义


你可能感兴趣的:(Makefile中常用的一些符号)