0
点赞
收藏
分享

微信扫一扫

qt day2

艾晓雪 2023-12-12 阅读 43
linux

目录

一、make/Makefile的简单使用

二、Makefile 的语法规则

三、实现的原理

3.1 make/Makefile识别文件新旧

3.2 .PHONY修饰的伪目标总是被执行

3.3 make/Makefile是具有依赖性的推导能力的

四、语法技巧

五、注意事项


一、make/Makefile的简单使用

  • 创建Makefile
    touch Makefile
  •  编写Makefile:
    vim Makefile
  • 编写要生成的可执行程序mybin和项目清理clean:
  • 使用make命令生成可执行程序
    make
  • 使用make命令进行项目清理
    make clean

二、Makefile 的语法规则

Makefile 中包括依赖关系(目标依赖)依赖方法(命令)
下面是 Makefile 中一些要素的基本语法规则:

使用make和make clean,就可以方便地完成项目自动化构建和清理。

三、实现的原理

3.1 make/Makefile识别文件新旧

make命令不是每次都会重新编译,只有更改过的文件才会重新编译。(提高编译效率)
若源代码没有更改也重新编译,那么每次预处理编译汇编链接的时间比较长,成本高。

重新编译的本质:重新写入一个二进制的可执行文件(bin文件),文件的修改时间会跟着更改。

  • 第一次的时候,一定是先有源文件,才有bin文件。
    源文件的修改时间 < bin文件的修改时间
  • 第二/n次的时候,我们对源文件做任何修改的时候,
    源文件的修改时间 > bin文件的修改时间
    ​​​​​
    重新编译形成可执行

大部分情况下重新编译都没问题,问题的产生不仅仅是修改新文件就能解决的。有些历史问题需要重新清理项目才可以解决。

综上,make 是通过对比源文件和bin文件的Modify时间确定文件新旧的。

3.2 .PHONY修饰的伪目标总是被执行

通过时间对比,可以做到不让有些代码进行重新编译(不让某些操作进行)。

例如:mybin被.PHONY修饰,则多次make时,都会执行gcc命令,把可执行程序重新形成。

3.3 make/Makefile是具有依赖性的推导能力的

上一节讲到gcc编译生成一个可执行程序需要经过预处理、编译、汇编和连接,中间会产生.i,.o,.s文件。但是在上面的操作中都没有生成中间文件。
但是我们知道一件事:生成bin文件,就需要对应的.o文件。

以Makefile的推导过程如下:(类似一个栈结构)

生成了临时文件 code.o code.s code.i

以上写法只是为了了解编译推导的过程,实际上不推荐使用。

建议直接用gcc形成可执行!


四、语法技巧

  1. Makefile里面的指令执行时会自动回显出来,可以在前面加上 符号使其不回显,不显示指令信息。
  2. 可以使用 echo 添加一些输出信息。
  3. 依赖方法可以不止一个,用回车隔开。
  4. makefile中用 注释
  5. makefile中可以编写变量,表达式之间不建议带空格
    通过 $(变量名) 来引用变量的值。

    用途:之后如果想使用g++,只需要把gcc改成g++,mybin改成mybin.exe
  6. 可以用 #^ 符号代替依赖关系中的所有内容,#@ 代替要形成的目标文件

 


五、注意事项

  • 首次make时,make扫描Makefile文件时,自顶向下。如果发现第一个目标文件,则尝试根据该目标及其依赖关系构建目标文件。(默认一次形成一个最终的目标文件)
  • 伪目标文件没有实际的依赖关系,每次都会执行其定义的命令,而不是构建文件。
  • Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
    显式规则说明了,如何生成一个或多个目标文件。
  • make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写makefile,比如源文件与目标文件之间的时间关系判断。
  • 在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,通常使用 $(var) 表示引用变量。
  • 文件指示。在一个makefile中引用另一个makefile,类似C语言中的include;
    ".mk" 是用来表示 Makefile 文件的扩展名。
    include path/to/another_makefile.mk
    
    target: dependency
        command
    
  • 注释,makefile中可以使用 # 在行首表示行注释
  • 默认的情况下,make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"、"makefile"、"Makefile"的文件。
举报

相关推荐

Qt day2

【Qt】day2

QT学习day2

#day2

day2——

RHCE Day2

React【Day2】

PTA day2

0 条评论