makefile 结构规则,依赖,伪目标

简介: makefile 结构规则,依赖,伪目标

前言


一、Makefile 规则格式

  1. makefile 的意义
    用于定义源文件间的依赖关系。
    说明 如何编译各个源文件并生成可执行的文件。
  2. Makefile 中规则的格式一般为:
    各个元素的含义:
  • target : 通常是需要生成的目标文件名。make 所需执行的命令名称。
    可以包含多个目标,使用空格对多个目标名进行分离。
  • prerequisities : 当前目标  所依赖 的 其他目标或文件。
    可以包含多个依赖, 使用空格对多个依赖进行分离。
  • command : 完成目标所需要执行的命令
    每一个命令必须以 [ Tab ] 字符开始,[ Tab ] 字符告诉 make 此行是一个命令行。

二、依赖示例:

对于 makefile 的依赖关系,通过上文 我们对依赖有了一定的了解。

下面 来一个makefile 的依赖示例。

all : test
  @echo "make all"
test :
  @echo "make test"

解析上面的代码:

  • all : 在Makefile中,all是一个伪目标,用于指定默认要执行的规则。通常情况下,如果没有指定目标,默认执行的就是Makefile中的第一个目标。因此,我们可以把all作为第一个目标,当我们执行make命令时,默认会执行Makefile中的all规则,从而完成整个编译过程。
  • test : 由于 test 作为 all 的依赖目标, 所以在执行 all 的命令前 要先执行 test 目标的命令。

最后的运行结果就是 在终端 先打印出字符串 " make test ", 再打印出 " make all "。

依赖的规则

1.当目标对应的文件不存在,执行对应命令。

2.当依赖在时间上比目标更新,执行对应的命令。

3.当依赖关系连续发生时,对比依赖链上的每一个目标。

三、伪目标

1. makefile 中的伪目标:

  • 通过 .PHONY 关键字声明一个伪目标。
  • 伪目标不对应任何实际的文件。
  • 不管伪目标的依赖是否更新,命令总是执行

为什么要使用伪目标呢?

主要是 避免与同名文件冲突。例如,如果有一个名为 clean 的目标,而系统中也存在一个名为 clean 的文件,执行 make clean 命令时,可能会误删除同名文件。使用伪目标可以避免这种问题,因为伪目标不对应真正的文件,执行伪目标的命令不会影响同名文件。

2. 伪目标的语法

先声明 , 后使用。用 # 表示注释。

本质 : 伪目标是 make 中的特殊目标 .PHONY 的依赖。

# 声明一个 clean 的伪目标
.PHONY : clean  
clean :
  rm *.o hello.out

例如: clean 目标命令。命令 rm *.o hell.out. 表明删除 所有的 .o 文件,和 hello.out 可执行文件。

.PHONY : clean
clean :
  rm *.o hello.out

3. 伪目标的规则调用

原理: 当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。

hello.out : func.o main.o
  gcc -o hello.out func.o main.o
func.o : func.c
  gcc -o func.o -c func.c
main.o : main.c
  gcc -o main.o -c main.c
#声明了rebuild clean all三条伪目标
.PHONY : rebuild clean all 
rebuild : clean all
all : hello.out
clean :
  rm *.o hello.out

rebuild 伪目标 依赖于 clean 和 all, 所以要 执行 rebuild 目标时,要先去执行 clean 和 all命令。

相当于函数的调用。

4. 绕开 .PHONYY关键字定义伪目标

原理:

如果 一个规则没有命令 或者依赖,并且它的目标不是一个存在的文件名,则 在执行此规则时,目标总是被认为是最新的,命令就会总是执行。相当于 伪目标.PHONY的使用。

clean : FORCE
  rm *.o hello.out
FORCE : 

FORCE 目标没有命令 ,依赖。那么在执行此规则时,总是被认为是最新的,命令就会总是执行。

四、小技巧:

1. 命令无回显

在Makefile中执行命令时,默认情况下会将命令回显到控制台上。也就是说,如果Makefile规则中包含命令,执行make命令时会显示命令的输出信息。

makefile 中可以在命令前加上 @ 符,即可将命令的回显去掉

2. 可执行文件 和 all 同时作为 makefie 中的第一条规则的目标。

工程开发中可以将最终的 可执行文件all同时作为 makefie 中的第一条规则的目标。

例如下面的代码:

hello.out all : main.o func.o
  gcc -o hello.out main.o func.o
main.o : main.c
  gcc -c main.c -o main.o
func.o : func.c
  gcc -c func.c -o func.o

当我们多次执行 make 时,就会出现下面的现象:

如果我们想要再次执行 makefile 文件,观察执行结果,而不出现上面的现象的话, 可以 添加一个 all :

all 是一个虚假目标(Phony Target),它并不表示生成实际的文件,而是一个用于指定默认执行的目标。当我们在终端(Linux/Mac)或命令提示符(Windows)中输入 make 执行构建操作时,如果没有指定目标,就会执行该 Makefile 文件中默认的目标。

相关文章
|
编译器 Shell Android开发
工具技能学习(一):前置技能-makfile、make、.mk
工具技能学习(一):前置技能-makfile、make、.mk
462 0
|
编译器 Linux 调度
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
2750 0
|
Shell Linux C++
【Shell 命令集合 文件管理】Linux 拷贝命令 cp命令使用指南
【Shell 命令集合 文件管理】Linux 拷贝命令 cp命令使用指南
951 0
常见的BUG---1、虚拟机启动之后,突然发现没有ens33网卡
常见的BUG---1、虚拟机启动之后,突然发现没有ens33网卡
|
应用服务中间件 Linux 网络安全
Linux 安装 Nginx 并配置为系统服务(超详细)
Linux 安装 Nginx 并配置为系统服务(超详细)
|
10月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
1084 8
|
存储 缓存 安全
可重入函数与不可重入函数
可重入函数与不可重入函数
428 0
|
Linux vr&ar 开发者
Linux 命令 `ar` 详解:静态库的管理利器
`ar` 命令是 Linux 管理静态库的工具,常用于创建、修改和提取 `.a` 文件。基本语法为 `ar [选项] 目标文件 [成员...]`。常用选项包括:`rcs` 创建(更新)静态库,`t` 列出成员,`x` 提取成员,`d` 删除成员。注意文件顺序、创建索引、备份和跨平台兼容性。学习和掌握 `ar` 命令能提升系统开发效率。
|
缓存 Shell 开发工具
Git Bash⭐一、安装软件,与Git Bash基础命令
Git Bash⭐一、安装软件,与Git Bash基础命令
|
C语言
Makefile基础教学(include的使用方法)
Makefile基础教学(include的使用方法)
276 0