linux基础梳理2019.01.22(makefile)
发布日期:2021-05-06 23:06:50 浏览次数:22 分类:精选文章

本文共 891 字,大约阅读时间需要 2 分钟。

makefile

 

makefile的三要素:

  • 目标
  • 依赖——可以不写
  • 规则命令——可以不写

 

写法:

目标:依赖

tab键规则命令

 

例子:

利用main.c文件调用其余文件中的函数。

实现样例:

 

makefile的弊端:

如果更改其中一个文件,所有的源码都要重新编译。

解决方案:

编译过程分解。先生成 .o 文件,使用 .o 文件来得到成果。

 

要想分解编译过程,先来分析一下编译的原理:

编译的“规则是递推的”,比如下图中的可执行文件 app, 他依赖main.o , add.o 和 div.o 生成。编译时,如果没有main.o 文件,则编译器回去寻找有没有main.o的生成规则。这就是“规则是递推的”

根据规则,我们把上面的makefile重新写一下:

 

makefile中的定义变量

可以定义变量 ObjFiles=main.o add.o sub.o div.o …

变量的使用:$(ObjFiles),$(变量名)

 

 

函数

  • wildcard——可以进行文件匹配
  • patsubst——内容的替换

 

wildcard使用例子:

makefile的隐含规则——默认处理第一个目标,我们需要他处理我们的test目标,测试一下函数的功能,因此可以这样:

make test

 

patsubst的使用例子

 

 

makefile的变量

  • $@  代表目标
  • $^    代表全部依赖
  • $<    第一个依赖
  • $?    第一个变化的依赖

因此上面的第一版makefile可以改成

其中,%表示通配。$@, $<这样的变量,只能在规则中出现。

 

 

makefile清理

  • -f 代表强制执行,不加的话,如果没有对应的文件时,会报错
  • @表示不输出,虽然命令执行了,但是不会在屏幕上体现出来
  • 表示,即使这个命令报错了,也会执行(和 -f的功效类似)

上面的代码存在一个问题——clean的作用是清理,执行clean之后,会产出一个目标文件“clean”。该如何解决这个问题?

使用——.PHONY,定义伪目标,防止歧义

 

多个makefile文件时,如何指定执行哪一个?

执行以下命令即可:

make -f makefile1

 

上一篇:分门别类刷leetcode——贪心算法(C++实现)
下一篇:linux基础梳理 2019.1.19(环境变量,scp,vim各种操作,gcc,静态库,动态库)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月09日 00时05分18秒