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)

  

posted @ 2017-11-28 11:49  *平凡*随风舞  阅读(728)  评论(0编辑  收藏  举报