makefile中伪目标的理解

简介: 1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command … …   2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c a.c b.o:b.c  gcc -c b.c Test: a.o b.o   gcc -o Test a.o b.oclean:  rm *.o 我们可以单独这么运行:make a.o或者make b.o或者make clean注意上面三个的区别。

1. 我们知道Makefile中的语法是这样:

target ... : prerequisites ...
command

 

2. 假如编译两个文件可以这么写:

a.o:a.c
  gcc -c a.c
b.o:b.c
  gcc -c b.c
Test: a.o b.o  
 gcc -o Test a.o b.o
clean:
  rm *.o

我们可以单独这么运行:
make a.o
或者
make b.o
或者
make clean
注意上面三个的区别。前两个都会生成目标,而第三个不会生成目标,仅仅希望执行所在规则(clean)定义的命令(rm)。
这个时候就需要伪目标出马了:目的不是为了生成目标,仅仅是希望执行其所在规则定义后面的命令

 

3. 伪目标定义

a.o:a.c
  gcc -c a.c
b.o:b.c
  gcc -c b.c
Test: a.o b.o
  gcc -o Test a.o b.o
.PHONY:clean
clean:
  rm *.o

就像上面这样,多一个 .PHONY声明,那么clean就是伪目标了


4. 为什么要使用伪目标:
1)避免在我们的Makefile中定义的只执行命令的目标和工作目录下实际文件名字出现冲突。(比如,假如当前目录有一个clean文件,那么上面的 make clean 就不能达到我们的预期了)
2)提高执行效率,被声明为伪目标后,make在执行此规则时不会视图去查找隐含规则来创建这个目标。

目录
相关文章
|
Ubuntu Windows
Ubuntu截图快捷键
Ubuntu截图快捷键
3894 0
|
网络协议 Ubuntu 网络安全
使用VScode SSH公网远程连接本地服务器开发【无公网IP内网穿透】
使用VScode SSH公网远程连接本地服务器开发【无公网IP内网穿透】
|
10月前
|
机器学习/深度学习 存储 人工智能
《深度剖析:Q-learning与策略梯度方法的本质区别》
在强化学习领域,Q-learning和策略梯度方法是两种重要的算法。Q-learning通过迭代更新状态-动作值(Q值),评估动作价值,适用于离散动作空间;策略梯度方法则直接优化参数化策略,适合连续动作空间。前者收敛稳定但速度较慢,后者收敛快但稳定性差。两者各有优劣,适用于不同场景。
388 27
|
Linux Docker Windows
docker中使用绑定挂载(Bind mounts)
【10月更文挑战第9天】
900 1
|
11月前
|
人工智能 算法 物联网
Lyra:SmartMore 联合香港多所高校推出的多模态大型语言模型,专注于提升语音、视觉和语言模态的交互能力
Lyra是由香港中文大学、SmartMore和香港科技大学联合推出的高效多模态大型语言模型,专注于提升语音、视觉和语言模态的交互能力。Lyra基于开源大型模型和多模态LoRA模块,减少训练成本和数据需求,支持多种模态理解和推理任务。
379 33
Lyra:SmartMore 联合香港多所高校推出的多模态大型语言模型,专注于提升语音、视觉和语言模态的交互能力
|
XML 存储 数据库
如何使用Android Studio创建一个基本的音乐播放器应用
如何使用Android Studio创建一个基本的音乐播放器应用
668 0
|
Ubuntu Unix Linux
Linux专栏01:Linux发展历史及背景介绍
Linux专栏01:Linux发展历史及背景介绍
801 0
|
存储 数据库 Android开发
StarRocks 【新一代MPP数据库】(3)
StarRocks 【新一代MPP数据库】
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
398 2