makefile 笔记
makefile 笔记:
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释makefile 中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如:Delphi 的make,Visual C++的nmake,Linux 下GNU 的make。可见,makefile 都成为了一种在工程方面的编译方法。
程序的编译和连接.
在各种操作系统上执行的程序都是编译之后的Binary文件,在不同的操作系统上要编译成对应的可执行文件.但不同的编译器对C/C++源码都是先编译 (compile)成中间代码文件(object file),在UNIX中是.o文件.然后在把大量的.o文件合成可执行的文件,这个过程叫连接(linking).
有时候由于要连接的目标文件很多,所以就将一些相近的目标文件"打个包",在windows下这种包叫"库文件"(library file),也就是.lib文家,在UNIX下是Archive file,通常是.a文件.
编译时,编译器只检查程序语法,以及函数,变量等是否被声明.在连接的时候,会在所有的object file中寻找函数的具体实现,如果找不到,那就会报连接错误.
makefile 的基本规则:
target....:prerequisites....
command
.......
.......
prerequisites 中如果有一个以上的文件比target 文件要新的话,command 所定义的命令就会被执行。这就是Makefile 的规则。也就是Makefile中最核心的内容。
make 的工作步骤
1, 首先会在当前的目录下寻找"Makefile"或者"makefile"文件.(也可以通过,make -f FILENAME 的方式声明使用哪个文件).
2,默认情况下它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件(所以,一般都是将最终的目标放在最前面)。
3、如果"target"文件不存在,或是"target"所依赖的后面的prerequisites文件的文件修改时间要比"target"这个文件新,那么,他就会执行后面所定义的命令来生成"target"这个文件。
4、make会接着检查prerequisites中的文件是否也有依赖关系存在,如果有,就依次递归.(有点类似压栈).
5、当然,你的C 文件和H 文件是存在的啦,于是make 会依次执行command,(有点类似出栈)直到完成了第一个target依赖关系对应的命令。
*也可以显式的指明make的入口,这样就不是将文件中第一个"target"做为解析依赖关系,并递归压栈的起点,而是将指明的入口处的"target"目标作为开始.
makefile中变量的使用:
定义变量:
VariableName=........
引用变量
$(VariableName)
makefile的自动推导
只要make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系,并且cc -c [.c] 也会被推导出来.