【转载】 Makefile的静态模式%.o : %.c
版权声明:本文为CSDN博主「猪哥-嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012351051/article/details/88600562
===================================================
Makefile的静态模式是一个特别高效的“自动化”编译器,“静态”二字,我觉得是直译词意,可能是我不是真正理解什么叫静态,反正这个规则跟中国话的 “静态”没有半毛钱关系。
我们先说一种场景,我们在编写应用程序时,肯定不只有一个文件,会有n多个.C文件,.s文件,少则几十个,多则几千、几万个,我们在windows下写代码,是有各种IDE的,可以一键编译,但linux环境下,是看不上这种方式的,需要我们自己写Makefile的,这个Makefile的功能就类似于IDE的一键编译,是一个编译脚本,写好Makefile的人,都是牛x的人,因为对各种技术细节都掌握了。
我们知道一个执行程序的生成,一般是需要2个步骤的,分别为编译和链接,编译的原理就是将.C和.S文件转换成.o文件,也就是所谓的目标文件,然后链接器,将这些目标文件.o 链接成 一个可执行文件。这两个步骤的 命令分别为:
编译: gcc -c xxx.c/xxx.s
链接: gcc *.o -o xxx
我们在编写Makefile时,一般的框架如下:
main : func1.o func2.o func3.o funcx.o
gcc $^ -o $@ func1.o : func1.c
gcc -c func1.c func1.o : func1.c
gcc -c func1.c func1.o : func1.c
gcc -c func1.c func1.o : func1.c
gcc -c func1.c ..........
其中main为终极目标,而其他的func1.o、func2.o.......一方面是目标main的依赖对象,但是他们本身又是一个小目标,需要进行编译生成。那么问题就来了,如果我们的程序只有几个.c文件还好,如果有几百个、几千几万个呢,我还能这么一个的写编译吗?
很显然这是不可能的,而且Unix/linux也不允许我们这么愚蠢,那么我们就理所当然的想,是不是有类似于变成语言中的各种循环策略啊,比如for循环、do...while循环什么的,但是即便有这些循环,这些文件名字什么的都不一样啊,我们肯定不能用for什么的命令的,那么Unix/linux给我们提供了什么方法呢,答案是:
静态模式 + 自动化变量
这个静态模式就是一种自动编译模式,在这种模式下,我们可以容易的定义“多目标”规则,让我们的规则变得更加有弹性和灵活。它的语法如下:
< targets ....> : < target-pattern > : < prereq-patterns ...>
<commands>
.....
其中:
targets定义了一些列的目标文件,也就是多目标,可以有通配符,是目标的一个集合。
target-pattern 是targets的模式,也就是目标集模式
prereq-patterns 则是目标的“依赖”元素,
这么去说,可能还是比较拗口,不容易理解,我们还是把理论落地,举例一下吧:
我们把target-pattern 定义成 %.o 意思是我们的target集合都是以.o结尾。当然这里也可以使用通配符*,只不过%多用于Makefile,他们两个的区别,我们后面再讲。而我们的prereq-patterns则定义为%.c,这意思就是对 target-pattern中所形成的目标集进行二次定义,其计算方法是取target-pattern模式中的%代表部分(其实就是去掉.o后的文件名),并为其加上[.c]结尾,形成新的集合。代码如下:
$(OBJS) : %.o : %.c
gcc -c $< -o $@
这两条命令的功能就是,大目标是OBJS,这个OBJS就是各种.o文件,然后%.o就是具体的解释,而%.c就是对应同样名字的.c文件,而下面的命令,结合了2个自动化变量,$< 表示依赖对象集中的第一个,$@ 则代表了目标集。所以这个功能就是要遍历所有的.c文件,对所有的.c文件进行编译,然后编译生成对应的.o文件。我们在实际编写程序时,targets是不需要的,可以简写如下:
%.o : %.c
gcc -c $< -o $@
=========================================
【转载】 Makefile的静态模式%.o : %.c的更多相关文章
- 转: 静态模式makefile中$(cobjs): $(obj)/%.o: $(src)/%.c
4.12 静态模式静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件.静态模式规则比多目标规则更通用,它不需要多个目标具有相同的依赖.但是静态模式规 ...
- 03-Linux命令基础-第03天(makefile、静态库、动态库、gdb调试工具)
01- 复习 tar tvf xxx 查看压缩包内容 区分前后台: 是否能和用户交互 Vmware选桥接模式 会给系统虚拟一个和外部相同网段的ip 02- vim扩展操作 因为不是做嵌入式开发的 所以 ...
- ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式
一.类图(Class Diagram) 描述一组类.接口.协作已经它们之间的图,用来显示系统中各个类的静态结构图. 类之间的关系(relationship) *依赖(dependency) *泛化(g ...
- 【转载】PHP运行模式的深入理解
PHP运行模式的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-03我要评论 本篇文章是对PHP运行模式进行了详细的分析介绍,需要的朋友参考下 PHP运行模式有4钟:1) ...
- 转载-------makefile 使用总结
转载自:http://www.cnblogs.com/wang_yb/p/3990952.html 1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的 ...
- [转载] 常用 Java 静态代码分析工具的分析与比较
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
- Makefile 编译静态库文件及链接静态库
本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h 3 atexit.c Makefile 5 staticlib/lib/ staticlib ...
- [转载]Matlab之静态文本多行输出
转载文章,原文链接:Matlab中的静态文本框中显示多行内容 有时候,我们在GUI中利用静态文本框显示程序的结果,但是结果很长,一行未必可以显示的开,而静态文本框不像edit或listbox那样通过滚 ...
- 转载__Activity的启动模式
http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 当然,在Android中,除了在AndroidManifest.x ...
- Ubuntu下通过makefile生成静态库和动态库简单实例
本文转自http://blog.csdn.net/fengbingchun/article/details/17994489 Ubuntu环境:14.04 首先创建一个test_makefile_gc ...
随机推荐
- 网络诊断工具nslookup的使用
nslookup 是一个网络诊断工具,用于查询域名系统(DNS)记录,将域名解析为IP地址,或者查询其他DNS记录类型,如MX(邮件交换记录).CNAME(别名记录)等.以下是一些常见Linux发行版 ...
- Hibernate Validator 校验注解
Hibernate Validator 校验注解/** * 认识一些校验注解Hibernate Validator * * @NotNull 值不能为空 * @Null 值必须为空 * @Patter ...
- 一文了解Spark引擎的优势及应用场景
Spark引擎诞生的背景 Spark的发展历程可以追溯到2009年,由加州大学伯克利分校的AMPLab研究团队发起.成为Apache软件基金会的孵化项目后,于2012年发布了第一个稳定版本. 以下是S ...
- SpringCloud开发之OpenFeign timeout和压缩等问题
在某些时候,我们希望某个同步调用执行更长的时间(异步暂时不考虑),这个时候,首先就是要设置OpenFeign的timeout设定. 下面我们举例来说明,可以如何设定TimeOut参数. 一.环境 脱离 ...
- 京东云上centos8.2 安装 consul1.11.1
做个笔记下 -- 前言 部分内容有参考网友的,但是地址不记得了! 安装内容基本参考官网的和上一个网友的 官网地址: https://www.consul.io/downloads 以下是使用root方 ...
- 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU
为了更好的阅读体验,请点击这里 由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细. 5.1 层和块 事实证明,研究讨论"比单个层大"但"比整个模型小&quo ...
- HMS Core 6.2.0版本发布公告
新增动作捕捉能力.通过简单拍摄即可获得人体3D骨骼关键点数据,广泛应用于虚拟形象.体育运动和医学分析等场景: 3D物体建模能力iOS版本上线. 查看详情>> 新增道路吸附能力.可根据坐标点 ...
- 【论文阅读】Learning to drive from a world on rails
引用与参考 代码地址:https://github.com/dotchen/WorldOnRails 论文地址:https://arxiv.org/abs/2105.00636 论文部分 已看完 写在 ...
- python路径相关操作:os.path
Windows路径格式 import os # 当前python文件位置:T:\ProgrammingPractice\python_path\test.py # 给定的路径 path = r'D:\ ...
- Linux启动Java程序jar包Shell脚本
手动方式启动和终止java程序 启动java程序jar:nohup java -jar XXX.jar 查看程序占用pid:ps -ef | grep XXX.jar 或 jps jps是jdk提供的 ...