Makefile知识简单总结
以下大部分信息来自跟我一起写Makefile
一个简单的例子如下;
int main()
{
char str[20];
scanf("%[^r]",str);
printf("%s\n",str);
return 0;
}
target : test.o
cc -o target test.o
test.o : test.c
cc -c test.c #命令必须要以tab键开头
clean:
rm target test.o
1,Makefile中的变量
示例: objects = main.o 那么在makefile中可以像如下这样使用该变量 $(objects)
2,清空目标文件的规则
.PHONY : clean #.PHONY表示clean是一个伪目标
clean :
-rm target #rm前加一个-表示也许删除过程某些文件出现问题,但是忽略错误
3,Makefile的文件名
默认使用Makefile,如果一定要使用其它的文件名,可以用make -f来指定对应的makefie
4,引用其它的Makefile
include <filename>
示例如下: include foo.mak
5,Makefile的书写规则
第一条规则中的目标被确定为最终目标
makefile的书写规则是支持通配符的,有如下三种:“*”,“?”,“[...]” 如: a[bcd]e可以是abe或者aceh或者ade “?”表示匹配字符一次或者0次
6,Makefile中文件的搜索
用VPATH变量或者vpatch关键字
7,Makefile中的伪目标
.PHONY
8, $@ 自动化变量,表示目标集中所有目标的集合
$< 自动化变量,表示了所有依赖目标的挨个值
9,makefile命令的执行
使用“@”时,这个命令不被make显示出来,
对于makefile的调试可以使用make -n,那么只显示命令而不执行具体命令
如果后一条命令的执行依赖于前一条命令那么两条命令必须在同一行,中间用分号隔离,如: cd /home ;pwd
为了忽略命令的执行错误可以在命令前加一个 “-”
10,makefile中的变量
makefile中的变量可以使用后面定义的值,
makefile中用变量定义变量的方法:
y := $(x) bar
x := foo
那么y的值是bar,而不是 foo bar,所以用 := 前面的变量不能使用后面的变量
我们可以使用“+=”来给变量追加值
11,makefile中使用条件判断
ifeq ($(cc),gcc)
$(cc) -o .....
else
....
endif
具体的关键字有: ifeq ifneq ifdef ifndef
12,makefile中使用函数
函数如何调用:$(<function><arguments>),函数名和参数之间以空格分隔,参数之间以逗号分隔,函数的参数可以使用变量
以下大部分信息来自跟我一起写Makefile
一个简单的例子如下;
int main()
{
char str[20];
scanf("%[^r]",str);
printf("%s\n",str);
return 0;
}
target : test.o
cc -o target test.o
test.o : test.c
cc -c test.c #命令必须要以tab键开头
clean:
rm target test.o
1,Makefile中的变量
示例: objects = main.o 那么在makefile中可以像如下这样使用该变量 $(objects)
2,清空目标文件的规则
.PHONY : clean #.PHONY表示clean是一个伪目标
clean :
-rm target #rm前加一个-表示也许删除过程某些文件出现问题,但是忽略错误
3,Makefile的文件名
默认使用Makefile,如果一定要使用其它的文件名,可以用make -f来指定对应的makefie
4,引用其它的Makefile
include <filename>
示例如下: include foo.mak
5,Makefile的书写规则
第一条规则中的目标被确定为最终目标
makefile的书写规则是支持通配符的,有如下三种:“*”,“?”,“[...]” 如: a[bcd]e可以是abe或者aceh或者ade “?”表示匹配字符一次或者0次
6,Makefile中文件的搜索
用VPATH变量或者vpatch关键字
7,Makefile中的伪目标
.PHONY
8, $@ 自动化变量,表示目标集中所有目标的集合
$< 自动化变量,表示了所有依赖目标的挨个值
9,makefile命令的执行
使用“@”时,这个命令不被make显示出来,
对于makefile的调试可以使用make -n,那么只显示命令而不执行具体命令
如果后一条命令的执行依赖于前一条命令那么两条命令必须在同一行,中间用分号隔离,如: cd /home ;pwd
为了忽略命令的执行错误可以在命令前加一个 “-”
10,makefile中的变量
makefile中的变量可以使用后面定义的值,
makefile中用变量定义变量的方法:
y := $(x) bar
x := foo
那么y的值是bar,而不是 foo bar,所以用 := 前面的变量不能使用后面的变量
我们可以使用“+=”来给变量追加值
11,makefile中使用条件判断
ifeq ($(cc),gcc)
$(cc) -o .....
else
....
endif
具体的关键字有: ifeq ifneq ifdef ifndef
12,makefile中使用函数
函数如何调用:$(<function><arguments>),函数名和参数之间以空格分隔,参数之间以逗号分隔,函数的参数可以使用变量