Makefile
理由:Linux环境下,编码、测试、自动化编译都靠自己解决
add.c
| #include "test.h" int add(int x, int y){ } |
test.h
| #ifndef _TEST_H #define _TEST_H int add(int x, int y); #endif |
Makefile编写
| test:add.o gcc -o test add.o add.o:add.c test.h gcc -c add.c clean: rm -rf test rm -rf *.o |
编译简单原理:
先将源文件编译为中间代码文件,在Linux的.o文件,window为.obj文件,即Object File,这个动作称为编译(compile),然后将中间代码文件合成执行文件,这个动作叫链接(link)
编译:只管语法、函数与变量声明的正确性;通常需要告诉编译器头文件的位置,如“add.o:add.c test.h”,当语法正确时,编译器就能编译出中间文件,一般是一一对应的
链接:主要是链接函数和全局变量;只在中间目标文件中寻找函数,且需要显示的给定目标文件名,当目标文件较多时,可以打包便于操作,linux下.a文件(Archive File),windows下.lib文件(库文件)
总结:函数未被在h文件中声明,可以生产Object File,编译器给出警告;而链接在所有的Object File中找不到函数的实现,会报链接错误码(Linker Error),Link 2001
常规写法
|
target:目标文件 依赖的中间文件
command
clean
|
编译规则
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
3、如果test文件不存在,或是test所依赖的后面的 .o 文件的文件修改时间要比test这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、如果test所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生成make的终极任务,也就是执行文件test了。
变量的声明:
如果多次使用多个同样的中间目标文件,则可以声明var_name=1.o 2.o 3.o;然后通过$(var_name)来引用
伪目标:
.PHONY : clean
同时在rm前加'-',让其跳过错误
高级的gun make有自动推倒功能,能根据给定的c和h文件,自动生成o文件
即只写add.o:add.c test.h,不需要gcc -o add.o
make clean来清除中间中间文件,便于重编译,也很利于保持文件的清洁
更多内容参考http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D
浙公网安备 33010602011771号