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正是依据这样一层一层的的依赖关系和连接 依赖文件 和 目标文件 的命令 所构成的。

附(执行效果):

3、注意

  ①系统默认执行第一个目标文件,然后依次找它的依赖文件,若后边的目标文件与前面的所需要的依赖文件无关,则不执行,从这里可以看出计算机是按正常逻辑一层一层执行(从下往上),而我们写的Makefile文件就需要倒着写;

  ②可指定执行特定目标文件格式:make <目标>

posted @ 2022-03-02 22:59  yangrourou  阅读(181)  评论(0编辑  收藏  举报