Makefile 之 自动生成依赖性

    在Makefile中的依赖关系可能会需要包含一系列的头文件,比如,
    如果的main.c中有一句"#include defs.h",那么的依赖关系应该是:

    main.o : main.c defs.h


    但是,如果是一个比较大型的工程,必需清楚哪些C文件包含了哪些头文件,并且,
    在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。
    为了避免这种繁重而又容易出错的事情,可以使用C/C++编译的一个功能。
    大多数的C/C++编译器都支持一个"-M"的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。
    例如,如果执行下面的命令:
        cc -M main.c

    其输出是:
        main.o : main.c defs.h

    于是由编译器自动生成的依赖关系,这样一来,就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。
    需要提醒一句的是,如果使用GNU的C/C++编译器,得用"-MM"参数,不然,"-M"参数会把一些标准库的头文件也包含进来。

        gcc -M main.c的输出是:

        main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
             /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
             /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
             /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
             /usr/include/bits/sched.h /usr/include/libio.h \
             /usr/include/_G_config.h /usr/include/wchar.h \
             /usr/include/bits/wchar.h /usr/include/gconv.h \
             /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
             /usr/include/bits/stdio_lim.h

        gcc -MM main.c的输出则是:

        main.o: main.c defs.h


    那么,编译器的这个功能如何与的Makefile联系在一起呢。
    因为这样一来,Makefile也要根据这些源文件重新生成,让Makefile自已依赖于源文件?
    这个功能并不现实,不过可以有其它手段来迂回地实现这一功能。

    GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,
    为每一个"name.c"的文件都生成一个"name.d"的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。

    于是,可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在的主Makefile中,
    这样,就可以自动化地生成每个文件的依赖关系了。

    这里,给出了一个模式规则来产生[.d]文件:

        %.d: %.c
            @set -e; rm -f $@; \
            $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \
            sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \
            rm -f $@.$$$$

    这个规则的意思是,所有的[.d]文件依赖于[.c]文件,"rm -f $@"的意思是删除所有的目标,也就是[.d]文件,

    第二行的意思是,为每个依赖文件"$<",也就是[.c]文件生成依赖文件,"$@"表示模式"%.d"文件,
    如果有一个C文件是name.c,那么"%"就是"name","$$$$"意为一个随机编号,第二行生成的文件有可能是"name.d.12345",
    
    第三行使用sed命令做了一个替换,关于sed命令的用法请参看相关的使用文档。第四行就是删除临时文件。


    总而言之,这个模式要做的事就是在编译器生成的依赖关系中加入[.d]文件的依赖,即把依赖关系:

        main.o : main.c defs.h

    转成:

        main.o main.d : main.c defs.h


    于是,的[.d]文件也会自动更新了,并会自动生成了,
    当然,还可以在这个[.d]文件中加入的不只是依赖关系,包括生成的命令也可一并加入,让每个[.d]文件都包含一个完赖的规则。

    一旦完成这个工作,接下来,就要把这些自动生成的规则放进的主Makefile中。
    可以使用Makefile的"include"命令,来引入别的Makefile文件,例如:

        sources = foo.c bar.c
        include $(sources:.c=.d)


    上述语句中的"$(sources:.c=.d)"中的".c=.d"的意思是做一个替换,把变量$(sources)所有[.c]的字串都替换成[.d]。
    当然,得注意次序,因为include是按次来载入文件,最先载入的[.d]文件中的目标会成为默认目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解TTY体系:设备节点与驱动程序框架详解

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍 interrupt子系统专栏&#xff1a; 专栏地址&#xff1a;interrupt子系统Linux 链式与层级中断控制器讲解&#xff1a;原理与驱动开发 – 末片&#xff0c;有专栏内容观看顺序 pinctrl和gpio子系统专栏&#xf…

Qt如何屏蔽工具栏(QToolBar)自动折叠功能

最近发现Qt上工具栏一行放不下的时候&#xff0c;会自动折叠起来。当用户点击展开功能的小三角按钮时&#xff0c;工具栏会展开成多行。这个功能本身没什么问题&#xff0c;但是当工具栏展开的时候&#xff0c;鼠标光标一旦不小心移动到了工具栏外面&#xff0c;这时候&#xf…

【大语言模型】ACL2024论文-17 VIDEO-CSR:面向视觉-语言模型的复杂视频摘要创建

【大语言模型】ACL2024论文-17 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建 目录 文章目录 【大语言模型】ACL2024论文-17 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建目录摘要研究…

华为openEuler考试真题演练(附答案)

【单选题】 以下关于互联网的描述&#xff0c;哪个选项是正确的? A:Nginx 在万维网中可以作为 ftp 服务器的反向代理&#xff0c;并与ftp服务器的数量--对应 B:Nginx 在互联网中可以作为 web服务器端&#xff0c;成为万维网的一个节点 C:互联网上的的资源需使用 Nginx进行七层…

web网络安全系统

最近了解了基于web的网络安全系统的设计与实现项目&#xff0c;在这个平台记录一下这个基于web的网络安全系统的设计与实现项目&#xff0c;方便以后再次使用或学习的时候能够及时的翻阅。在完成基于web的网络安全系统的设计与实现项目的时候&#xff0c;考虑了很多框架。最终决…

03 —— Webpack 自动生成 html 文件

HtmlWebpackPlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 安装 npm install --save-dev html-webpack-plugin 下载html-webpack-plugin本地软件包 npm i html-webpack-plugin --save-dev 配置webpack.config.js让webpack拥有插件功能 const HtmlWebpack…

传奇996_32——npc及怪物顶戴花翎

离线文档直接搜&#xff1a;顶戴花翎功能、NPC顶戴花翎配置 一共两步&#xff1a; 添加顶戴动态特效\Mir200\Envir\NpcIcons**\xx.txt 写对应文件&#xff0c;没有文件或问文件夹自己新建&#xff0c; **是npclist.xlsx中配置的npc路径地图名xx是npc名称 举例&#xff1a; 9…

Jmeter进阶篇(27)压测时如何计算最合适的并发量

Jmeter性能测试大全:Jmeter性能测试大全系列教程❤,如果觉得我讲的还不错,欢迎订阅哦~ 📚如何确定 JMeter 压测中的并发量 在进行性能测试时,确定合适的并发量是非常非常重要的一步。并发量决定了模拟用户的数量,她会直接影响到测试结果的有效性和可靠性。 在实际做性…

[RoarCTF2019]polyre WP

先用deflat去以下流平坦化 ~/Desktop/re/file took 3s │ tools Py │ at 00:43:37 ❯ python ../tools/deflat-master/flat_control_flow/deflat.py ./attachment 0x400620 *******************relevant blocks************************ prologu…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术&#xff0c;设计了…

golang通用后台管理系统09(系统操作日志记录)

1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…

100.【C语言】数据结构之二叉树的堆实现 上

目录 1.顺序结构 2.示意图 ​编辑 从物理结构还原为逻辑结构的方法 3.父子节点编号的规律 4.顺序存储的前提条件 5.堆的简介 堆的定义 小根堆和大根堆 6.堆的插入 7.堆的实现及操作堆的函数 堆的结构体定义 堆初始化函数HeapInit 堆插入元素函数HeapPush 堆向上…

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要&#xff0c;可以通过以下步骤来实现使用 root 登录&#xff1a; 1、设置 root 密码 打开终端&#xff0c;使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…

博客摘录「 nvm安装与使用详解(Window11)」2024年4月10日

nvm -v nvm安装详细教程&#xff08;安装nvm、node、npm、cnpm、yarn及环境变量配置&#xff09;-CSDN博客

我们来学mysql -- EXPLAIN之type(原理篇)

EXPLAIN之type 题记示例表type 题记 书接上文《 EXPLAIN之select_type》2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff…

【拥抱AI】对比embedding模型gte-Qwen2-7B-instruct和bge-m3:latest(三)

为了更全面地评估 gte-Qwen2-7B-instruct 和 bge-m3:latest 的性能&#xff0c;我们可以从以下几个方面进行详细比较&#xff1a; 1. 模型架构和规模 gte-Qwen2-7B-instruct 架构&#xff1a;基于Transformer的大型语言模型。参数量&#xff1a;7B参数&#xff0c;具有较强的…

HTB:MonitorsTwo[WriteUP]

连接至HTB服务器并启动靶机 靶机IP&#xff1a;10.10.11.211 分配IP&#xff1a;10.10.16.7 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 rustscan -a 10.10.11.211 -r 1-65535 使用nmap对靶机开放端口进行脚本、服务扫描 nmap -p 22,80 -sCV 10.10.11.211 漏洞利用 使…

Keepalived部署

Keepalived部署 安装配置单VIP模式配置master节点查看节点IP信息配置 keepalived.conf启动且加入开机自启查看是否生效 配置backup节点配置 keepalived.conf启动且加入开机自启查看是否生效 主备测试 多VIP配置 keepalived.conf查看IP 安装 dnf install -y keepalived配置 单…

【MySql】实验五 综合练习:学生成绩管理系统

文章目录 数据库设计与查询实践&#xff1a;学生成绩管理系统表结构设计学生信息表 student_info课程信息表 curriculum成绩表 grade1. 查询选修课的人数2. 查询学号为0001、0002、0003、0004的学生的姓名和出生日期3. 向grade表插入一条记录&#xff0c;学号为0004、课程编号为…

Android U 多任务启动分屏——SystemUI流程(更新中)

前文 Android U 多任务启动分屏——Launcher流程&#xff08;下分屏&#xff09; 前文说到通过ISplitScreen接口跨进程调用到了SystemUI进程&#xff0c;我们继续分析分屏在systemui中的实现。 wmshell实现分屏 实现ISplitScreen接口 代码路径&#xff1a;frameworks/base/…