MAKEFILE的编写及快速入门
大牛博客文章:http://blog.csdn.net/haoel/article/details/2886
makefile的文章比较少,看了大牛的文章后茅塞顿开,针对大型项目,makefile文件都是必不可少的,可以减少重复编译,方便维护,加快编译速度,极大的提高工作效率,一旦写好,只需要使用make命令,即可自动完成,所以了解makefile,是入门的首要前提。
在linux上面,比如我们需要制作一个动态库,常规步骤如下:
1,gcc -c *****.c -o *****.o -fPIC
//将数据段合并 和 地址回填,进行链接
2,gcc -shared -o lib*****.so ***1.o ****2.o ...
//将所有.o文件最后生成lib*****.so库文件
如果C文件较多的情况下,就需要反复执行第一步,而且每次如果一旦修改了什么地方,又需要重新编译,非常麻烦
使用makefile那就变得相当简单了,以下是最终代码:
src=$(wildcard ./src/*.c) obj=$(patsubst ./src/%.c,./obj/%.o,$(src)) target=./lib/libtest.so ALL:$(target) $(target):$(obj) gcc -shared -o $@ $^ $(obj):./obj/%.o:./src/%.c gcc -c $< -o $@ -I./inc -fPIC .PHONY:clean ALL clean: -rm -rf $(target) $(obj)
初略一看,肯定会懵,但真正了解后,就非常简单了,如何去理解,这里有三个要素:
1 条规则
目标:依赖
命令
要求,目录必须晚于依赖条件生成时间,如果不满足,则更新目标,如果依赖不存在,则寻找新的依赖生成。
2 个函数
$(wildcard 参数):获取指字类型特征的文件
$(patsubst 参数1,参数2,参数3):根据执行类型变量,生成新的变量
$(patsubst %.c ,%.o,$(src)):可以理解为将参数3中的 参数1部份,替换成 参数2的部分
3 个自动变量
$@: 在规则的 命令中,表示目标
$^: 在规则的 命令中,表示所有依赖条件
$<: 在规则的 命令中,表示第一依赖,如果是模式规则,则会将依赖依次取出
现在在去看上面的最终代码,则不难理解:
src=$(wildcard ./src/*.c) //源文件 obj=$(patsubst ./src/%.c,./obj/%.o,$(src)) //将c替换成o target=./lib/libtest.so //生成的目标库文件 ALL:$(target) //最终的生成,跟main函数一样,按照此执行 //目标target,依赖obj $(target):$(obj) gcc -shared -o $@ $^ //为防止有多个找不到,前面加上obj,则是找obj的依赖 //后面紧跟着的仍然是目标:依赖 $(obj):./obj/%.o:./src/%.c gcc -c $< -o $@ -I./inc -fPIC .PHONY:clean ALL clean: //执行清理操作,此处没有像上面的目标依赖可以取,所以直接写变量名 -rm -rf $(target) $(obj)