【转载】 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 ...
随机推荐
- 在ftl模板中调整表格
- 安装PHP5.6.20
安装php的前提是安装了数据库和httpd!!!!!!!! 1 因为yum缺省安装的是PHP5.4,所以先要添加yum库 [root@svnhost ~]# rpm -Uvh https://mirr ...
- Nginx SSL证书更新及密码套件更新
一.域名更换证书 ssl证书一般包括证书文件crt.cer.pem.pfx和私钥文件key. CER.CRT.PEM 和 PFX 是不同的证书文件格式,它们之间存在一些区别: CER (DER 编码) ...
- 保护您的Web应用:使用雷池(SafeLine)WAF的入门指南
雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动.旨在提供卓越的安全保护.本文将带您一步步了解如何安装.配置和测试SafeLine,以及如何利用 ...
- QT学习:01 工程文件详解
--- title: framework-cpp-qt-01-工程文件详解 EntryName: framework-cpp-qt-01-project-file date: 2020-04-08 1 ...
- python基础-列表list [ ]
列表的定义和操作 列表的特性: 元素数量 支持多个 元素类型 任意 下标索引 支持 重复元素 支持 可修改性 支持 数据有序 是 使用场景 可修改.可重复的 一批数据记录场景 # 定义一个列表list ...
- Java开发框架演变过程
JavaWeb开发简史 Java框架创始人 Java框架说明 Spring: 把应用程序中的bean统一交给Spring进行管理控制,简化了我们的代码操作,和降低了代码的耦合度,Spring框架基本上 ...
- yb课堂 实战之路由拦截和订单模块 《四十二》
前置守护 路由拦截功能开发 文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html router里面配置需要登陆的路由 ...
- 基于MindSpore实现BERT对话情绪识别
本文分享自华为云社区<[昇思25天学习打卡营打卡指南-第二十四天]基于 MindSpore 实现 BERT 对话情绪识别>,作者:JeffDing. 模型简介 BERT全称是来自变换器的双 ...
- FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
<FFmpeg开发实战:从零基础到短视频上线>一书的"第11章 FFmpeg的桌面开发"介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Win ...