【Linux开发技术之程序构建】Makefile学习(不断更新)
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
1.入门篇
1)Makefile的作用:帮助编译多文件。
2)基本编写示例:以如下四个文件为例
//main.c #include"mytool1.h" #include"mytool2.h" int main(int argc,char **argv) { mytool1_print("hello"); mytool2_print("hello"); } //mytool1.h #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char *print_str); #endif //mytool1.c #include"mytool1.h" void mytool1_print(char *print_str) { printf("This is mytool1 print %s",print_str); } //mytool2.h #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char *print_str); #endif //mytool2.c #include"mytool2.h" void mytool2_print(char *print_str) { printf("This is mytool2 print %s",print_str); }
对应进行编译构建的Makefile为
main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h gcc -c mytool2.c
Makefile 的本质是参与构建的源代码之间依赖关系和编译方法进行说明。一般采用的格式如下:
target: components
TAB rule
第一行表示的是依赖关系. 第二行是规则,使用TAB 键进行
main:main.o mytool1.o mytool2.o 就是所谓的依赖关系,实际上是一种庖丁解牛的方式,建议在纸上画好关系依赖图,如本例:
main
---main.o--(main.c,mytool1.h,mytool2.h)
|
mytool2.o--(mytool2.c,mytool2.h)
|
mytool1.o--(mytool1.c,mytool1.h)
而gcc -o main main.o mytool1.o mytool2.o 就是所谓的规则。
3)简化
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件,使用替代规则可以简写上例如下:
main:main.o mytool1.o mytool2.o gcc -o $@ $^ main.o:main.c mytool1.h mytool2.h gcc -c $< mytool1.o:mytool1.cmytool1.h gcc -c $< mytool2.o:mytool2.cmytool2.h gcc -c $<
如果有规律的命名规则,则可以简写上例如下:
main:main.o mytool1.o mytool2.o gcc -o $@ $^ ..c.o: gcc -c $<