一、参考资料
二、GCC编译器选项
选项 | 说明 |
---|---|
-o name | 指定编译生成的文件名 |
-c hello.c | 只编译生成目标文件(.o) |
-O0 | 不进行优化 |
-static | 禁止使用共享链接 |
-Wall | 生成所有警告信息 |
-w | 不生成任何警告信息 |
-IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY |
-LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY |
-lLIBRARY | 连接时搜索指定的函数库LIBRARY |
-Wl,option | 此选项传递 option 给连接程序; 如果 option 中间有逗号, 就将 option 分成多个选项, 然 后传递给会连接程序 |
-g | 编译的时候产生调试信息 |
三、Makefile语法说明
1.语法基础
① 用户自定义变量。如 OBJS = EAVBHERSBVREUVHBOSDRVBO
调用时,加上$ ,再括起来。$(OBJS)
② Makefile中有预定义变量,用户不要进行定义。
③ 还有一类自动变量:
$+ 所有依赖项
$< 第一个依赖项
$@ TARGET
$* TARGET(不包括扩展名)
④ VPATH变量可以指定需要搜索的目录。
⑤ 递归make:
可以递归调用每个子目录的Makefile。例如:在当前目录存在Makefile,而add
目录和sub目录也存在Makefile。
总控Makefile。
子目录Makefile。
⑥ Makefile中还有一些函数。
2.foreach函数
foreach是个Makefile中的函数。
$(foreach <var>,<list>,<text>)
这个函数的意思是,把参数<list>
中的单词逐一取出放到参数<var>
所指定的变量中,然后再执行< text>
所包含的表达式。每一次<text>
会返回一个字符串,循环过程中,<text>
的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>
所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
使用示例:
names := a b c d
files := $(foreach n,$(names),$(n).o)
上面的例子中,$(name)
中的单词会被挨个取出,并存到变量n
中,$(n).o
每次根据$(n)
计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)
的值是a.o b.o c.o d.o
。
注意,foreach中的<var>
;参数是一个临时的局部变量,foreach函数执行完后,参数<var>
的变量将不在作用,其作用域只在foreach函数当中。
3.wildcard函数
SRC = $(wildcard *.c ./foo/*.c)
搜索当前目录及./foo/下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息,比如./foor/bar.c。
4.notdir函数
FILES =$(notdir $(SRS))
notdir把展开的文件的路径去掉,只显示文件名而不包含其路径信息。
这行的作用是把上面以.c
结尾的文件的文件列表中附带的路径去掉,只显示符合条件的文件名。
5.patsubst函数
OBJ = $(patsubst %.c %.o $(SRC))
patsubst是patten substitude的缩写,匹配替代的意思。这句是在SRC
中找到所有.c
结尾的文件,然后把所有的.c
换成.o
。