跟我一起写Makefile(工程笔记版)
gcc编译的四个过程
详解解释见链接
gcc main.o input.o calcu.o -o main
相当于
gcc -o main main.o input.o calcu.o
Makefile 的规则
makeg工作原理
在默认的方式下,也就是我们只输入 make 命令。那么,
1、make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到
“edit”这个文件,并把这个文件作为最终的目标文件。
3、如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时间要比 edit
这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
4、如果 edit 所依赖的.o 文件也存在,那么 make 会在当前文件中找目标为.o 文件的依
赖性,如果找到则再根据那一个规则生成.o 文件。(这有点像一个堆栈的过程)
5、当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文
件生命 make 的终极任务,也就是执行文件 edit 了。
使用变量 $(objects)
隐晦规则.PHONY : clean (伪目标)
引用其他的Makefile
include
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
环境变量 MAKEFILES
make工作原理
GNU 的 make 工作时的执行步骤入下:(想来其它的 make 也是类似)
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
1-5 步为第一个阶段,6-7 为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,
make 会把其展开在使用的位置。但 make 并不会完全马上展开,make 使用的是拖延战术,如
果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展
开。
通配符:“*”,“?”和“[…]”。 “%”
,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。
还有有一个~波浪号
如果是“~/test”,这就表示当前用户的$HOME 目录
赋值符“=” “?=” “+=”
?= 这个相当于#ifndef #define #endif
如果变量 curname 前面没有被赋值,那么此变量就是“zuozhongkai”,如果前面已经赋过值了,那么就使用前面赋的值。
Makefile自动化编程
文件搜寻 VPATH = src:…/headers
举例:vpath %.h …/headers
该语句表示,要求 make 在“…/headers”目录下搜索所有以“.h”结尾的文件。(如果某文件在当前目录没有找到的话)
连续vpath
vpath %.c foo
vpath % blish
vpath %.c bar
其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。
vpath %.c foo:bar
vpath % blish
而上面的语句则表示“.c”结尾的文件,先在“foo”目录,然后是“bar”目录,最后
才是“blish”目录。