使用gcc编译:
几乎最简单的gcc编译命令,将a.c和b.c编译成一个执行文件test。
gcc -o test a.c b.c
需要Makefile原因:
只要我们在shell执行上面的命令,gcc都会将a.c和b.c编译。无论两个C文件的内容是否修改过。我们很容易想到,万一某个工程有许多文件编译成一个可执行文件,每当我们只要是修改某个文件的一个标点符号都需要编译一次,而且还需要等待较长时间。那样何年何月才会把这个项目完成。
要是有一个工具,能帮我判别我这个文件是否被需改过,没修改就不用帮我编译,修改的帮我编译一下,这样该有多好啊!
这下我们就需要Makefile去帮助我们做这个。
Makefile的核心:
目标 : 依赖1 依赖2 …
[TAB]命令
当依赖文件比目标文件“新”(也有可能不存在)的时候,才会执行命令。
其实或多或少没那么智能,甚至有点鸡肋。这个“新”的意思就是判断依赖的保存时间是否更改来判断的。其实也已经足够了。谁会无聊“调皮”地戏弄一个可以用的“轮子”(无需更改)。
Makefile的简单语法:
-
.通配符: %.o
$@ 表示目标
$< 表示第1个依赖文件
$^ 表示所有依赖文件 -
假想目标: .PHONY:
如果目录下存在clean文件,make clean执行的结果就不是清除;
加上.PHONY: clean,就会执行我们makefile里的目标clean -
即时变量、延时变量, export
简单变量(即时变量) :
A := xxx # A的值即刻确定,在定义时即确定
B = xxx # B的值使用到时才确定
使用变量: $(A) $(B)
:= # 即时变量
= # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
+= # 附加, 它是啥变量还是取决于前面的定义 -
make时取消命令输出
在命令前面加上@
-函数
$(foreach var,list,text)
$(filter pattern…,text) # 在text中取出符合patten格式的值
$(filter-out pattern…,text) # 在text中取出不符合patten格式的值
$(wildcard pattern) # pattern定义了文件名的格式,
# wildcard取出其中存在的文件
( p a t s u b s t p a t t e r n , r e p l a c e m e n t , (patsubst pattern,replacement, (patsubstpattern,replacement,(var)) # 从列表中取出每一个值
# 如果符合pattern
# 则替换为replacement
未完。。。。