初识Make&Makefile
在linux项目中,源码的编译一般分为手动和自动,两种方法都是基于gcc实现的。但在修改和重新编译的便捷程度上来说,手动不如自动,而自动编译一般是基于makefile来实现的编译。
makefile尤其是在中大型C Project中是非常有用的,实现了代码修改和编译的解耦合。实例如下:
code.c
//code.c
#include "code.h"
int myfun(int in){
return in + 1;
}
code.h
//code.h
extern int myfun(int);
prog.c
//prog.c
#include<stdio.h>
#include "code.h"
int main(void){
int i = 1;
printf("myfun(i) = %d\n",myfun(i));
}
如上实例其实比较简单,手动编译的话其实也只需要三行命令实现,如下:
gcc -c code.c -o code.o
gcc -c prog.c -o prog.o
gcc prog.o code.o -o test
但是如果我们通过makefile,其实可以只通过更为简短好记的命令完成编译:
Makefile
test: prog.o code.o
gcc prog.o code.o -o test
./test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
命令:
make test //实现编译并运行
make clearn //清除中间文件和编译后的可执行文件
通过比较手动和自动,不难发现基于makefile的自动编译省去了敲命令的时间,还减少了gcc命令的输入错误和输入时间,有助于后期项目的修改和维护。
详解Makefile文件逻辑
makefile的撰写逻辑其实是非常清晰的,想象有一颗倒过来的树,树的顶端就是你最终想要实现的可运行的文件,而依次往下就是你要编译的文件,得到的图解就会如下图所示:(基于上面的实例做示范)
借助工作树,可以帮助你更好的理解项目的依赖和编译过程.与此同时它也可以辅助你快速的写出项目的makefile文件实现项目的自动编译。
通过上面的工作树,我们可以得知:makefile里每一次编译动作的执行都需要两个参数(clean动作除外),如:
test: prog.o code.o
对此再进一步总结,就可以得出格式如下:
目标文件: 依赖文件列表
TAB命令
...
TAB命令
...
拓展
以上只是最简单和最基础的makefile的使用,进阶可以参考:
Makefile入门(超详细一文读懂)
全网最牛Linux内核Makefile文件详解
https://blog.csdn.net/github_27609763/article/details/46370023