通配符: “*”、“?”和“[…]”
Makefile 中统配符可以出现在以下两种场合:
1. 可以用在规则的目标、依赖中,make 在读取Makefile 时会自动对其进行匹配处理(通配符展开);
2. 可出现在规则的命令中,通配符的通配处理是在shell 在执行此命令时完成的。
除这两种情况之外的其它上下文中,不能直接使用通配符。而是需要通过函数“wildcard”来实现。 SRCS_C := $(wildcard *.c)
如果规则的一个文件名包含统配字符(“*”、“.”等字符),在使用这样的文件时需要对文件名中的统配字符使用反斜线(\)进行转义处理。例如“foo\*bar”,在Makefile
中它表示了文件“foo*bar”。Makefile 中对一些特殊字符的转义和B-SHELL 以及C 语言中的基本上相同。
自动变量
“$^”代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
“$@”代表规则的目标。
“$<”代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件
编译参数
-c 编译为二进制的中间文件
-fPIC 编译为静态库
-shared 编译为动态库。编译.so文件时,不需要main函数。遇到undefined reference to `main'错误时,加上这个选项即可。
-g 增加调试信息
-ggdb 增加调试信息,使用的是GDB调试器
-o 生成目标,后面的单词是目标名称
-O0 不进行优化处理
-O 或 -O1 优化生成代码
-O2 进一步优化
-Os 优化选项,相当于-O2.5。是使用了所有-O2的优化选项,但又不缩减代码尺寸的方法
-O3 比 -O2 更进一步优化,包括 inline 函数。
-L <directory> 指定链接时查找路径,多个路径用冒号隔开
-I 指定源代码中头文件路径(大写的i)
-l<libname> 指定链接某个库(小写的L)
循环语法
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
换成虚目标后,make可以并行处理
SUBDIRS = foo bar baz
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
foo: bar
其他:
error adding symbols: Bad value:由于编译时的选项有-fPIC和-shared,所以会出现这个问题。如果只需要编译可执行文件,就把这两个选项都删掉。