简介
在linux下编程,最熟悉的不过是Makefile了。这个文件是用于自动连接和编译的,而且记录所有工程文件的修改信息,这样,这个工程在下次编译前会自动重新编译。
特殊变量
$@ 目标文件
对应于target,”@” 是”argument”的简写。当你键入make foo的时候,”foo” 就是 argument,也就是@#(?).
$^ 所有依赖文件
与”$<”相类似,只不过它表示所有的的依赖的文件”^”记住嘛。
$< 第一个依赖文件
在依赖条件列表中的第一个输入文件。帮助记忆,”<”在shell中,这就是输入的”<”.
$?
所有的比target新的依赖文件(input),”你在干什么,哪些文件必须改变?”
%
%的作用类似于”*“在shell的作用,也就是任意匹配
以上会衍生出$(@D) $(@F),也就是目录和文件的区别
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o: main.c mytool1.h mytool2.h
gcc -c $< # -c 只输出目标文件,不产生可执行文件
mytool1.o: mytool1.c mytool1.h
gcc -c $<
缺省规则
.c.o:
gcc -c $<
这个规则表示所有的 .o文件都是依赖对应的.c文件的,简化以后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
函数
Makefile中有很多的函数,这里,将碰到的一一记录下来,做个完善。
wildcard
这个函数拾取特定目录下的文件通配符.比如我要将一个头文件.h三个源文件.c编译成 一个目标文件,那么,我就可以首先声明一个变量SRCS,然后将所有的源文件(包括头 文件)一起赋给它.
SRCS = $(wildcard *.c)
这样,变量SRCS就包括所有的源文件了
update 高级一点的用法,
$(patsubst %.c,%.o,$(wildcard))
这句话将所有文件名的后缀.c替换成.o,这样我们就可以得到当前目录下生成的可执行 文件。