Linux makefile

是什么:在大型工程,有许多源文件,如果一个一个gcc很不方便,只需要构建一个mikefile文件,在里面写一些规则,再输入make指令,就可以直接编译运行

构建项目的时候在哪个目录下执行构建命令 make这个目录下的 makefile 文件就会别加载,因此在一个项目中可以有多个 makefile 文件,分别位于不同的项目目录中。

1.规则

复制代码
# 每条规则的语法格式:
target1,target2...: depend1, depend2, ...
	command
	......
	......

目标(target):

通过执行规则中的命令,可以生成一个和目标同名的文件

规则中可以有多个命令, 因此可以通过这多条命令来生成多个目标, 所有目标也可以有很多个

通过执行规则中的命令,可以只执行一个动作,不生成任何文件,这样的目标被称为伪目标

依赖(depend):生成目标需要的条件

命令(command):shell 命令

2.工作原理

规则

按顺序执行,一个规则没法实现就跳到下一个规则,如果后面目标都得出来了并且是第一条规则的依赖,会执行第一条

如果想要执行 makefile 中非第一条规则对应的命令, 那么就不能直接 make, 需要将那条规则的目标也写到 make的后边, 比如只需要执行规则3中的命令, 就需要: make b.o。

文件时间戳

make 命令执行的时候会根据文件的时间戳判定是否执行makefile文件中相关规则中的命令。

目标是通过依赖生成的,因此正常情况下:目标时间戳 > 所有依赖的时间戳, 如果执行 make 命令的时候检测到规则中的目标和依赖满足这个条件, 那么规则中的命令就不会被执行。

当依赖文件被更新了, 文件时间戳也会随之被更新, 这时候 目标时间戳 < 某些依赖的时间戳, 在这种情况下目标文件会通过规则中的命令被重新生成。

如果规则中的目标对应的文件根本就不存在, 那么规则中的命令肯定会被执行。

简而言之,一般情况下,不动依赖,命令条件没更新,不执行

动依赖,命令改动,要执行,覆盖原先旧的目标

演示:在makefile中进行规则编写,再make

3.变量

在mikefile规则中,有时候目标或者依赖太多写起来超级繁琐,就使用变量

3.1 自定义变量

3.2 预定义变量

3.3 自动变量

复制代码
# 这是一个规则,普通写法
calc:add.o  div.o  main.o  mult.o  sub.o
        gcc  add.o  div.o  main.o  mult.o  sub.o -o calc
        
# 这是一个规则,里边使用了自定义变量
# 使用自动变量, 替换相关的内容
calc:add.o  div.o  main.o  mult.o  sub.o
	gcc $^ -o $@ 			# 自动变量只能在规则的命令中使用

4.模式匹配

语法重复的规则用通用模板写

5.函数

5.1wiledcard

获取指定目录下指定类型的文件名

5.2 patsubst

按照指定的模式替换指定的文件名的后缀

伪目标

当makefile中有一个指令 clean:表示清除操作,一般在shell中执行make都是会执行的。但如果在项目所在目录中新增一个clean文件,则清除指令不会执行。因为一旦新建,目标时间戳大于依赖,永远不会执行。此时需要定义一个伪指令

复制代码
# 添加规则, 删除生成文件 *.o 可执行程序
# 声明clean为伪文件
.PHONY:clean
clean:

在正常情况下,如果makefile中有一步指令有错误没有执行,那么就会跳出malefile如果makeshell中有一步指令错误没执行,想要继续执行后面指令,就需要在想要把不间断的指令前面加上-

相关推荐
未济2 天前
linux 配置环境变量
linux
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.2 天前
进程间通信
linux
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-052 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏2 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog2 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发