iphone-命令行编译之make和Makefile(三)
一、自动化变量
把模式所以定义的一系列文件自动逐个取出,直到所有的模式文件都取完
1.$@
目标的集合,就像数组,表示依次取出目标,并执行命令
2.$<
如果依赖目标是以模式“%”定义的,“$<”表示符合这模式的文件集。表示依次取出依赖文件
3.$?
所有比目标新的依赖文件集合
4.$^
所以依赖集合,以空格分隔。如果中间有重复文件,去除重复,保留部分
5.$+
和$^类似,所有依赖集合,不去重
6.$%
仅当目标是库文件时,表示库文件中的成员名。例如“test.a(content.o)”,那么“$%”表示content.o,“$@”表示test.a
二、静态模式
目标集合:目标集模式:目标集依赖模式
命令
objects=tes1.o test2.o
all:$(objects)
$(objects):%.o:%.c
cc -c $< -o $@
$<表示依赖目标集,“test1.c test2.c”
$@表示目标集,“test1.o test2.o”
规则展开后:
test1.o:test1.c cc -c test1.c -o test1.o test2.o:test2.c cc -c test1.c -o test2.o
三、Makefile的函数
$(函名名)
1.subst截取字符
$(subst 被截取字符串,要替换成的字符串,原始字符串)
$(subst chr,h,chrome)
上例是把字符串chrome的chr截取掉,替换为h,变成home
2.filter过滤文件
$(filter 匹配模式,总的目标集)
targets=test1.o test2.c test3.o
$(filter %.o,$(targets))
把targets集合的所有.o文件过滤出来,等于:“test1.o test3.o”
3.替换字符串
比如定义了变量sources
sources=test1.c test2.c test3.c
把所有.c文件替换为.o文件
方法1:
$(sources:.c=.o)
方法2:
$(patsubst %c,%.o,$(sources))
返回修改后的集合:
test1.o test2.o test3.o
四、自动生成依赖性
编译器用"-M"参数,自动寻找源文件中包含的头文件,并生成依赖关系
比如:test.c中有“#include "config.h"”,依赖关系为
test.o:test.c config.h
可以执行如下命令:
cc -M test.c
输出:
test.o:test.c config.h
GNU的gcc编译器为“-MM”参数: gcc -MM test.c
如果为“-M”的话,会包含所有标准库的头文件
五、命令
默认的,在命令执行前,make会把要执行的命令输出到屏幕
1.@屏蔽某条命令显示:用@字符在命令行前,则这个命令不会被显示在屏幕上
2.“-n”参数,只显示命令,而不执行
3.“-s”屏蔽所有命令显示
4.如果要让上一条命令结果应用到下一条命令,用分号隔开,写在同一行
5."-"忽略命令错误,只要在命令前加一个减号“-”符
6.全局忽略错误,只要在make命令的时候,加“-i”参数
7.跳过出错规则,继续执行其他规则,只要make命令里加“-k”参数
8.定义命令包,用define开始,用endef结束
define function_test
命令1
命令2
endef
执行命令:$(function_test)

浙公网安备 33010602011771号