makefile深入之编写规则.
接 上篇扩展部分如何写makefile
还有哪些makefile编写规则
多目标规则
多目标,也就是冒号前面可以有多个目标,个人觉得这种只是简化写法,目的是提高可维护性,虽然简化了但学习的门槛要提高了。比如:@$表示什么?要是不学习肯定不懂。@$是一个特殊的变量,也叫“自动化变量”表示表示着目前规则中所有的目标的集合。为了更好阅读别人的makefile,这种多目标语法还是要掌握的。基本的语法如下:
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
targets:表示一系列的目标文件
target-pattern:匹配的方法文件,一般指链接文件
prereq-patterns:上面匹配的方法文件再一次依赖,专用名词叫“依赖目标集”,如下面的例子
objects = foo.o bar.o #定义了object变量
all: $(objects) #定义了依赖 目标all要依赖于object
$(objects): %.o: %.c #object又要从.o结尾文件获取,.o文件又依赖于.c结尾的文件
$(CC) -c $(CFLAGS) $< -o $@ #cc是编译命令,不说了
#$<也是一个自动化变量,表示所有的依赖目标集
#$@,前面已经说了是目标集,并且是输出-o
#等价于
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
代码中的$(CC) -c $(CFLAGS) foo.c -o foo.o,包含了makefile文件的3种隐式规则,第1种为代码链接规则,第2种为源代码编译规则,第3种为汇编代码编译规则。编译器常用的链接命令选项含义如下:
- -o file 输出生成的 file文件
- -c 编译或汇编程序文件,但不会执行链接操作
- -T script 使用script脚本来分配内存
- -W1,option 给链接器发送一个选项,比如生成地址映射表,-Wl,-Map,output.map
- -mcpu=name 规定目标处理器的型号
- -Wall 使能所有警告调试信息输出
- -glevel 要求带调试信息的等级,-g0代表不产生调试信息,-g1代表产生最小的调试信息用来跟踪程序的运行,但不包括本地变量,-g3包含了一些额外的调试信息

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



