当前位置: 首页 > news >正文

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 会自动编译这两个文件并生成相应的可执行文件。

.PHONY:all
all: main1 main2main1: main1.cgcc -o $@ $^ (后面解释)main2: main2.cgcc -o $@ $^

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

.PHONY
all: main1 main2 cleanmain1: main1.cgcc main1.c -o main1main2: main2.cgcc main2.c -o main2clean:rm -f main1 main2


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

.PHONY:all
all: main1 main2 cleanmain1: main1.cgcc main1.c -o main1main2: main2.cgcc main2.c -o main2.PHONY: clean
clean:rm -f main1 main2


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

2  gcc -o $@ $^

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

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

http://www.lryc.cn/news/365703.html

相关文章:

  • Flutter 中的 FlexibleSpaceBar 小部件:全面指南
  • 每天一个数据分析题(三百五十四)-分析报表
  • 卫星通信频段有哪些
  • RobotMaster编程语言:深度探索与实践挑战
  • Ascend训练软件栈了解
  • 官网万词霸屏推广 轻松实现百度万词霸屏源码系统 带完整的安装代码包以及搭建教程
  • Linux 36.3 + JetPack v6.0@jetson-inference之图像分类
  • 重庆公司记账代理,打造专业财务管理解决方案的领先企业
  • transformers 阅读:Llama 模型
  • python绘制piper三线图
  • 咖啡机器人如何精准控制液位流量
  • Go go-redis应用
  • 从混乱到有序:PDM系统如何优化物料编码
  • npm发布自己的插件包
  • Pygame:新手指南与入门教程
  • 动态IP与静态IP的优缺点
  • 上海市计算机学会竞赛平台2024年1月月赛丙组最大的和
  • C++三大特性之继承,详细介绍
  • Python推导式详解
  • stm32中如何实现EXTI线 0 ~ 15与对应IO口的配置呢?
  • Python 短文本匹配,短文本语义相似度,基于大模型的短文本匹配,基于LLMs的短文本语义相似度识别,短文本语义扩充和匹配
  • 提升接口性能方式汇总
  • C++中的常见语法糖汇总
  • TensorFlow Playground神经网络演示工具使用方法详解
  • 【git】subtree 简单教程
  • C语言基础:字符串函数使用与剖析
  • 搭建Vulnhub靶机网络问题(获取不到IP)
  • Prompt 提示词强大方法论和框架2
  • C语言分支和循环(2)
  • 14.FreeRTOS 流媒体缓存 Stream Buffer