如何用一个makefile编译多个目标
使用 .PHONY, 使用方法见下面描述或参考链接. 经过测试可行. --------- phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:all : prog1 prog2 prog3.PHONY : allprog1 : prog1.o utils.occ -o prog1 prog1.o utils.oprog2 : prog2.occ -o prog2 prog2.oprog3 : prog3.o sort.o utils.occ -o prog3 prog3.o sort.o utils.o这样,使用"make"将可以将三个程序都生成了。d当一个phony 目标是另一个的依赖,其作用相当于子程序,例如:.PHONY: cleanall cleanobj cleandiffcleanall : cleanobj cleandiffrm programcleanobj :rm *.ocleandiff :rm *.diff
PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。
如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
clean:
rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会 执行;为避免这个问题,可使用".PHONY"指明该目标。如:
.PHONY : clean
这样执行"make clean"会无视"clean"文件存在与否。
已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
完整的例子如下:
.PHONY : clean
clean :
rm *.o temp
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
假设
你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设它需要 被生成,当把它的依赖文件更新后,就会执行它的规则里的命令行。
如果在我们的 makefile 开始处输入:
all : exec1 exec2
其中 exec1 和 exec2 是我们做为目的的两个可执行文件。 make 把这个 'all' 做为它的主要目的,每次执行时都会尝试把 'all' 更新。但既然这行规则里没有哪个命令来作用在一个叫 'all' 的 实际文件(事实上 all 并不会在磁碟上实际产生),所以这个规 则并不真的改变 'all' 的状态。可既然这个文件并不存在,所以 make 会尝试更新 all 规则,因此就检查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它们更新,从而达到我们的目的。
如何用一个makefile编译多个目标相关推荐
- Mac 从Makefile 编译 Rocksdb 源码的一些注意事项
文章目录 前言 Makefile 编译流程 1. 平台变量/环境变量的初始化. 2. 编译需要的源码文件变量初始化. 3. include 目录的设置. 4. 编译的执行逻辑. 问题记录1:可能的打包 ...
- makefile编译_C++ Lesson 5:编译Makefile
主要内容: 编译程序的过程:preprocessor.compiler.assembler.linker.loader Makefile 类的Makefile 其他方式:.h & .cpp 一 ...
- 训练softmax分类器实例_知识蒸馏:如何用一个神经网络训练另一个神经网络
作者:Tivadar Danka 编译:ronghuaiyang 原文链接 知识蒸馏:如何用一个神经网络训练另一个神经网络mp.weixin.qq.com 导读 知识蒸馏的简单介绍,让大家了解知识蒸 ...
- 机器视觉:makefile编译调用Caffe框架的C++程序
Caffe作为在众多公司搞深度学习时较多使用的框架,其在使用的友好程度上显然要比后起的一些深度学习框架要差一些,虽然如此,其作为深度学习的第一个开源框架,自有它的很多优势,比如设计结构.关于Caffe ...
- Makefile、多Makefile编译静态库、动态库、SRC实例总结
静态库生成及使用 calc.h #ifndef __MY_LIB_H__ #define __MY_LIB_H__ int add(int a, int b); #endif calc.c #incl ...
- 交互系统的构建之(一)重写Makefile编译TLD系统
交互系统的构建之(一)重写Makefile编译TLD系统 zouxy09@qq.com http://blog.csdn.net/zouxy09 为了对TLD系统做一些功能的填充,例如添加语音合成来提 ...
- 加快linux编译速度,Linux Makefile 编译速度的优化【转】
前言 如何提高 Makefile 的编译速度呢?既然是提高,那肯定是对于大项目而言,因为小项目本身源文件不多,Makefile 优化与否,对于编译速度而言,影响并不大.当然对于那些追求速度达到极致的人 ...
- 工程级Makefile编译模板
文章目录 1. 一点说明 2. 顶层目录的Makefile模板 3. 顶层目录的共通设定 4. 子目录中的Makefile模板 5. 应用实例 6. 后记 1. 一点说明 如果要使用Makefile编 ...
- 使用make命令编译C语言程序,c, c++用makefile编译工程 - 1
基本思路: 最外层有三个文件: Makefile, Make.share, Make.include. 每个工程目录中都有一个Makefile文件. 其中最外层的Makefile是外壳部分.需要调用者 ...
最新文章
- 从实验现象详细分析BGP的路由策略与选路原则
- 论嵌入式与单片机,相爱相杀。
- leetcode142. 环形链表 II
- 01章.计算机网络概述(1.1~1.6)
- 中国摊铺设备市场趋势报告、技术动态创新及市场预测
- Windows下实现gettimeofday()函数
- 常见排序算法之插入排序
- 图像处理(四) Sobel边缘检测与canny边缘检测对比
- GCD中的dispatch_barrier_async函数的使用(栅栏函数)
- [初学Python]利用某网站的功能写一个磁力链转种子工具
- python直方图教程_Matplotlib绘制直方图
- 如何下载浏览器中的flash 视频
- IE8跳转谷歌浏览器亲测有效
- MODBUS-RS485布线的8条准则
- npm 废弃/删除(五)
- 软件测试工程师Linux笔试题及答案(三)
- [附源码]Nodejs计算机毕业设计交通违章举报平台Express(程序+LW)
- phpcms mysql 事务_PHPCMS中mysql数据库优化教程
- 选矿采矿机械的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- [软件人生]外包兼职与绝路
热门文章
- LinkedIn高级分析师王益:大数据时代的理想主义和现实主义
- MQTT——java简单测试(二)
- IOM计算机组成原理,计算机组成原理设计教案.doc
- Tensorflow移动端之如何将自己训练的MNIST模型加载到Android手机上
- 哪款蓝牙耳机玩吃鸡延迟低?四款低延迟游戏蓝牙耳机推荐
- 从全球顶级数据库大会 SIGMOD 看数据库发展趋势
- word无法验证服务器,Office提示“无法验证此应用程序的许可证”时怎么处理?...
- linkedin 分享_如何将您的LinkedIn个人资料添加到WordPress
- javascript实现繁体简体转换
- SpringBoot(二):详细讲解SpringBoot整合MyBatis