Makefile:如何写目标依赖
本文并不是Makefile的教程,仅是本人学习时的感悟。
Makefile的基本格式
目标:依赖文件(or 目标)
[tab]命令
目标: 是要生成的或操作的命令的索引
依赖: 是生成目标依赖的文件或目标
命令: 是为了生成目标需要执行的shell语句
任意一个依赖文件被改动,将导致已存在的目标文件过期,简单来说,依赖的作用就是决定目标是否过期,是否需要重新编译。
举个例子,
#include <stdio.h>
#include "mylib1.h"
#include "mylib2.h"
int main(int argc, char argv[]){
printf("hello world!\n");
}
对应的Makefile可以是
helloworld: stdio.h mylib1.h mylib2.h other.o
gcc -o helloworld helloworld.c
也可以是
helloworld: other.o
gcc -o helloworld helloworld.c
前者希望在stdio.h、mylib1.h、mylib2.h、other.o被修改时重新执行helloworld目标,而后者仅仅希望检查other.o的修改。
目标依赖往往还有另外一种用法,用于执行其他目标。例如
.PHONY: all clean target
all: target clean
target: helloworld.o
gcc helloworld.o -o helloworld
helloworld.o:
gcc -c helloworld.c
clean:
rm helloworld.o
执行all
目标的时候,依赖另外两个目标target
和clean
。在执行all
目标前,会优先执行目标target
和clean
。
怎么判断all
依赖的是目标还是文件?
.PHONY: all
all: test
@echo in all
test:
@echo in test
执行这个Makefile时,当前目录下有无test文件会有两个不同的执行结果
[GMPY@11:24 tmp]$ll
总用量 4.0K
1186807 -rw-r--r-- 1 gmpy gmpy 57 4月 5 11:20 Makefile
[GMPY@11:24 tmp]$make
echo in test
in test
echo in all
in all
[GMPY@11:24 tmp]$touch test #创建test文件
[GMPY@11:24 tmp]$make
echo in all
in all
[GMPY@11:24 tmp]$
总结来说,判断依赖是目标还是文件,有以下两个规则:
- 优先检查当前目录下是否有同名文件,有则文件,无则目标
- .PHONY 标识的都是(伪)目标,不再检查文件是否存在
Makefile:如何写目标依赖的更多相关文章
- makefile自动生成目标与依赖的关系
有main.c: #include <stdio.h> #include "command.h" int main(int argc, const char *argv ...
- 第三篇 makefile的伪目标
我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下: 1.make将makefile的目标认为是一个文件: 2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...
- Makefile中的目标
Makefile中的目标 一般目标 目标就是我们需要的最终文件,也是make的最终输出 Makefile的运行机制是:先将目标当成文件,查看文件是否存在,如果存在且是最新,那么直接结束,如果文件不存在 ...
- Makefile之写demo时的通用Makefile写法
Makefile之写demo时的通用Makefile写法[日期:2013-05-22] 来源:CSDN 作者:gqb666 [字体:大 中 小] 前面的一篇文章Makefile之大型工程项目子目录M ...
- Makefile的伪目标
1.Makefile伪目标的格式: .PHONY : cleanclean: rm xxxx 2.Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创 ...
- 关于makefile中自动产生依赖的理解
本博文是在学习了<GNU Make中文手册>后记录下来的自己的关于自动产生makefile依赖的语句的理解,向大家分享. <GNU make中文手册>中的相关章节见一下链接: ...
- 一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件
通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...
- makefile中伪目标的理解
1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c gcc -c ...
- makefile怎么写?
参考:https://blog.csdn.net/haoel/article/details/2886 https://blog.csdn.net/haoel/article/details/2 ...
随机推荐
- 添加PHP扩展模块
php安装好后,可能在初次安装时,会有些模块会有遗漏,但是我们又不想重新编译php,因为耗时是比较长的.我们可不可以在不重新编译安装php的情况下,来为php单独添加某一个模块呢?查找资料,发现还是有 ...
- [BZOJ 4555][Tjoi2016&Heoi2016]求和
题意 给定 $n$ , 求下式的值: $$ f(n)= \sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\ j\end{Bmatrix}\times 2^j\time ...
- SVN There are unfinished transactions detected
在ECLIPSE中报这个错,不能提交和更新代码和clean up 解决办法:关闭ECLIPSE,使用工具对SVN执行 clean up. 重新启动ECLIPSE,解决冲突文件,可以正常使用SVN
- JS如何去掉一个数组的重复元素 (数组去重)
一.思路如下: 定义一个新数组,将老数组遍历一遍,再进行判断,如果新数组里面没有老数组的元素就添加,否则就不添加,最终输出整个新数组. 二.代码如下: var arr = ["a" ...
- Java并发案例04---生产者消费者问题03--使用ReentrantLock
/** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notif ...
- 【[GDOI2014]拯救莫莉斯】
可能我的状态比较鬼畜,应该没有人这么写 设\(dp[i][j][k]\)表示在第\(i\)行,放置油库的状态为\(j\),实际上周围已经有油库或者本身有油库的状态为\(k\)的时候的最小花费 由于我们 ...
- C++内存总结——开坑,随时总结添加
C++内存区域分为: 程序代码区:存储程序代码的地方 栈区:编译器自动管理(分配释放)的内存区域,如函数参数,函数中的局部变量 堆区(又称动态存储区):由C语言中的函数malloc和free和C++ ...
- [转]使用QT开发GoogleMap瓦片显示和下载工具
第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...
- notepad++怎样添加文件目录
需要安装一个Explorer.dll文件 方法一:这个方法我个人试了不成功,可能因为版本问题,进入后选择Explorer进行安装 方法二:网上下载 Explorer.dll文件,放到\\No ...
- PAT——1049. 数列的片段和
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...