Makefile文件使用
什么是Makefile
可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
为什么要使用Makefile
1、简化编译
编译的时候需要链接很多库, gcc 只会默认链接一些基本的C语言标准库,很多源文件依赖的标准库都需要我们手动链接,很麻烦,如果使用Makefile把要链接的库文件放在 Makefile 中,制定相应的规则和对应的链接顺序。这样只需要执行 make 命令,工程就会自动编译。每次想要编译工程的时候就执行 make
2、节省时间
Makefile 支持多线程并发操作,会极大的缩短我们的编译时间,并且当我们修改了源文件之后,编译整个工程的时候,make 命令只会编译我们修改过的文件,没有修改的文件不用重新编译,大大提高编译的效率(那么系统是如何判断文件是否被修改呢?这里就会涉及到timestamp(时间戳),依赖文件与目标文件都有一个对应时间戳,当依赖文件被修改后时间戳会更新,下一次进行编译时系统会对比依赖文件与目标文件的时间戳,若目标文件时间戳早于依赖文件,则说明依赖文件被修改系统就会重新编译;若没则不会被重新编译)
Makefile怎么写
1、Makefile格式
目标文件:依赖文件
<tab>执行指令 ...
2、示例:
编写一个a.c文件将它编译生成一个可执行文件需要以下几个步骤:
①a.c ->a.i
②a.i ->a.s
③a.s ->a.o
④a.o ->a
最后执行;(具体讲解请看上一期文章:https://www.cnblogs.com/yangrourou/p/15956764.html)
而将这个过程运用Makefile文件进行编写如下
1 build:a 2 ./a 3 a:a.o 4 gcc -o a a.o 5 a.o:a.s 6 gcc -c a.s 7 a.s:a.i 8 gcc -S a.i 9 a.i:a.c 10 gcc -o a.i -E a.c 11 clear: 12 rm -rf a a.o a.s a.i
我们发现生成可执行文件a需要4步,也就是先由a.c编译生成a.i;再从a.i编译生成a.s;再从a.s编译生成a.o;最后由a.o编译生成可执行文件a;我们可以看出:要先生成a.o这个中间文件才能生成a这个可执行文件,a.o这个文件称为目标文件a的直接依赖文件,那么a.s又是a.o的直接依赖文件,依次类推;makefile正是依据这样一层一层的的依赖关系和连接 依赖文件 和 目标文件 的命令 所构成的。
附(执行效果):
①系统默认执行第一个目标文件,然后依次找它的依赖文件,若后边的目标文件与前面的所需要的依赖文件无关,则不执行,从这里可以看出计算机是按正常逻辑一层一层执行(从下往上),而我们写的Makefile文件就需要倒着写;
②可指定执行特定目标文件格式:make <目标>