Linux中 .PHONY 和 all 在 Makefile 中的作用

1 .PHONY 和 all

.PHONY是 GNU make 工具中的一个特殊指令,用于指示某个目标是一个伪目标。伪目标并不对应于实际的文件,而是用来执行一系列命令的标识符 。使用 .PHONY 的好处包括避免与现有文件同名造成的冲突,以及提高 make 的执行效率,因为 make 不会尝试去查找伪目标对应的文件或其隐含规则。

all通常是 Makefile 中的默认目标,它代表了一系列其他目标的集合 。在all 目标中,可以列出所有需要构建的目标文件,使得用户只需输入 make 命令即可构建这些文件。如果 all目标有依赖关系,make 会检查这些依赖是否需要更新(可执行程序的修改时间是否早于源代码的修改时间),如果需要,则执行相应的命令来更新它们。

示例

假设你有两个 C 文件 `main1.c``main2.c',你想要分别编译它们并生成可执行文件**`main1``main2`。**你可以在 Makefile 中定义 **`all`**目标,并让它依赖于这两个可执行文件。然后,你可以为每个可执行文件定义单独的规则,指定它们的源代码文件和编译命令。这样,当你执行 `make` 命令时,make会自动编译这两个文件并生成相应的可执行文件。

cpp 复制代码
.PHONY:all
all: main1 main2

main1: main1.c
    gcc -o $@ $^ (后面解释)

main2: main2.c
    gcc -o $@ $^

如果你还想要定义一个清理目标 `clean`,用于删除生成的可执行文件,你可以这样做:

cpp 复制代码
.PHONY
all: main1 main2 clean

main1: main1.c
    gcc main1.c -o main1

main2: main2.c
    gcc main2.c -o main2

clean:
    rm -f main1 main2

然而,如果**`clean`目标没有任何依赖,make 可能会忽略它,因为它认为 `clean`文件已经存在。为了确保`clean` 目标总是被执行,你可以使用`.PHONY`来声明`clean`**是一个伪目标:

cpp 复制代码
.PHONY:all
all: main1 main2 clean

main1: main1.c
    gcc main1.c -o main1

main2: main2.c
    gcc main2.c -o main2

.PHONY: clean
clean:
    rm -f main1 main2

现在,无论clean文件是否存在,执行 make clean 都会删除 main1main2文件。

2 gcc -o $@ $^

gcc -o $@ \^**是一个在Makefile中常用的规则模式,用于指定如何编译和链接一个目标文件。这里的**@$^ 是Makefile的自动变量:

$@ 代表当前规则的目标文件名。

$^ 代表所有依赖于当前目标文件的源文件列表。

因此,gcc -o $@ \^** 的意思是使用 GCC 编译器,将所有依赖文件**^ 编译成目标文件**$@**。这通常用于定义如何从源代码文件生成可执行文件或对象文件的步骤。

相关推荐
woshilys28 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
疯狂飙车的蜗牛1 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
恩爸编程2 小时前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
Michaelwubo3 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
远游客07133 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<3 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟3 小时前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun3 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
LIKEYYLL5 小时前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu