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 ...
随机推荐
- 1、Docker 架构详解
本文来自clouldman ,有增删. Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image ...
- PHP调优
目录 php.ini 内存 Zend OPcache 文件上传 最长执行时间 处理会话 缓冲输出 真实路径缓存 php.ini PHP解释器在 php.ini 文件中配置和调优.web和cli使用的路 ...
- ASP.NET Core 编码、web编码、网页编码 System.Text.Encodings.Web
System.Text.Encodings.Web 空间包含表示 Web 编码器的基类.表示 HTML.JavaScript 和 Url 字符编码的子类,以及表示仅允许编码特定字符.字符范围或码位的筛 ...
- execl execv
int execl(const char *path, const char *arg, ...); 函数说明 execl()其中后缀"l"代表list也就是参数列表的意思第一参数 ...
- FOR YOU
给你 作者:余秀华 一家朴素的茶馆, 面前目光朴素的你皆为我喜欢 你的胡子,昨夜辗转的面色让我忧伤 我想带给你的,一路已经丢失得差不多 除了窗外凋谢的春色 遇见你以后,你不停地爱别人,一个接一个 我没 ...
- Java反序列化之Jackson-databind
这个洞的cve编号:CVE-2017-17485,漏洞环境就如第一个链接那样,jdk需要在jdk 1.8以上. 先看一下Jackson-databind的用法,说白了就是将json转换成对象. tes ...
- element-ui : <el-table> 按钮点击操作阻止@row-click
描述:<el-table> 点击行时,会跳转到一个详细信息页面, 但是同时这一行也有编辑和删除按钮. 问题: 在点击按钮时,@row-click事件也被触发了,而我并不想触发 row-cl ...
- 【jQuery】todolist
1 2 3 用npm命令下载依赖,优点:不用去网上找链接,代码都一样 4.jQuery自动下载进node_modules文件下 npm install jquery --save 这句命令的意思是保 ...
- 基于Azure Blob冷存储的数据压缩算法测试对比分析
背景说明: 近期公司的数据增量迅速增长,存储的成本太高,需要采用生命周期进行管理,热存储中的数据或者被删除,或者备份至冷存储.但是冷备时是否要压缩,需要进行验证.Azure本身没有提供压缩的接口,只能 ...
- 如何转换Xcode里打印的unicode编码日志
转换Xcode里打印的unicode编码日志 1)打开Terminal 2)输入python 3)print(u'\u6027\u611f\u597d\u83b1\u575e\u5973\u661f\ ...