作为Linux下的C/C++开发者,没接触过makefile一定说不过去,通常构建大型的C/C++项目都离不开makefile,也许你使用的是cmake或者其他类似的工具,但它们的本质都是类似的。
作为一个轻度使用者,应读者要求,斗胆介绍一下makefile,不过与普通的makfile教程不同的是,本文准备从另外一个角度来介绍。如有不妥之处,欢迎指出。
makefie到底是什么
在Linux下,对于下面这个简单的程序
//来源:公众号【编程珠玑】
//main.c
#include <stdio.h>
#include <math.h>
int main()
{
int a = 10;
int b = 4;
int c = pow(a,b);
printf("10^4 = %d",c);
return 0;
}
我们通常使用gcc就可以编译得到想要的程序了:
$ gcc -o main main.c -lm
(如果不理解为什么要加-lm,请参考《一个奇怪的链接问题》)。
对于单个文件的简单程序,一条命令就可以直接搞定了(编译+连接),但是如果是一个复杂的工程,可能有成千上万个文件,然后需要链接大量的动态或静态库。试想一下,你还想一条一条命令执行吗?懒惰的基因是刻在程序员骨子里的。
因此你可能会想,那我写个脚本好了。嗯,听起来好多了。
文件多就多,你告诉我要编译哪里的文件,我遍历一下就好了,你再告诉我要链接哪些库,我一一帮你链接上就好了。
然而到这里又会想,既然编译链接都是这么类似的过程,能不能给它们写一些通用的规则,搞得这么复杂干嘛?然后按照规则去执行就好了。
而makefile就是这样的一个规则文件,make是规则的解释执行者。可以类比shell脚本和bash解释程序的关系。
所以,makefile并不仅仅用于编译链接,只不过它非常适合用于编译链接。
makefile什么样?
它最重要的规则语法如下:
<target> : <prerequisites>
[tab] <commands>
咋一看,就这么个玩意?但是什么意思?
-
target 要生成的目标文件名称
- 要依赖的文件
-
[tab] 对,就是tab键,初学者很容