码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下makefile学习

时间:2018-04-24 23:24:33      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:执行文件   依赖   https   冒号   也会   技术分享   tps   时间   bubuko   

[make是什么?]

  make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。

[为什么要使用make?]

  假设,现在一个项目里面包含了100个程序文件,如果要对这个项目进行编译,那么光是编译指令就有100条。如果要重新进行编译,那么就又得像之前一样重新来一遍。这样重复且繁琐的工作实在是让我们很不爽啊。所以,用make来进行操作,间接调用gcc岂不是很方便?如果我们更动过某些原始码档案,则 make 也可以主动的判断哪一个原始码与相关的目标文件档案有更新过, 并仅更新该档案。这样可以减少重新编译所需要的时间,也会更加方便。

[makefile又是干什么的?]

   makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

[定义]

Makefile文件由一系列规则(rules)构成。每条规则的形式如下。

<target> : <prerequisites>
[tab] <commands>

上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。

目标:

 一个目标就构成一条规则。目标通常是文件名,指明make命令要构建的对象,目标可以是一个文件名,也可以是多个文件名。之间用空格分隔。

除了文件名,目标还可以是某个操作的名字(如:clean),这称为是“伪目标”(phony target)

前置条件:

前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。

命令:

命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。

 

当你写下一个规则的时候,例如:

unit: output.o test2.o
    gcc -o unit output.o test2.o

就是说,让编译器以(output.o  test2.o)为前置条件,使用gcc编译器对这两个目标文件进行链接生成 unit 可执行文件 ,

但是如果(output.o  test2.o)这两个文件中有一个不存在,我们可以在makefile文件中再添加两条规则来生成这个文件.

output.o:test2.h output.c
    gcc -c output.c

test2.o:test2.h test2.c
    gcc -c test2.c

 

对于两个源文件一个头文件,使用一个完整的makefile文件规定他们之间的编译规则:

unit: output.o test2.o
    gcc -o unit output.o test2.o

output.o:test2.h output.c
    gcc -c output.c

test2.o:test2.h test2.c
    gcc -c test2.c

#删除所有目标文件,并声明clean为伪目标
.PHONY:clean
clean:
    rm *.o

执行结果:

技术分享图片

 

 Make 处理makefile文件的过程了解一下?

缺省情况下,make开始于第一个目标,这个目标称为缺省最终目标.如上面的makefile文件中的 unit .

这样,当我们在终端敲下 make 命令的时候,Make 就会读取当前目录下的makefile文件,并开始处理第一条规则,本例中就是链接生成unit可执行文件,

但在make全部完成本规则工作之前,必须先处理 unit 所依靠的OBJ文件,这些OBJ文件被按照自己的规则处理更新,每个OBJ文件的更新规则是编译其源文件.如果源文件都没有改变,则不进行重新编译.

其他规则的处理根据他们的目标和缺省最终目标的依赖关系来判断,如果没有任何关联,则不会被执行.除非告诉make强制执行.如:[make clean]

在OBJ文件被重新编译(如果需要的话)之后,make决定是否重新链接生成unit的可执行文件.任何文件有改变的话,则对有依赖的文件进行编译,并生成新的可执行文件.

 

参考资料:

https://www.cnblogs.com/qiaopei/p/5550168.html

 

Linux下makefile学习

标签:执行文件   依赖   https   冒号   也会   技术分享   tps   时间   bubuko   

原文地址:https://www.cnblogs.com/qsyll0916/p/8934103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!