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)

 

 

posted @ 2012-03-08 18:33  月光的尽头  阅读(1266)  评论(0)    收藏  举报