Makefile基础教程(自动生成依赖关系)

13 篇文章 18 订阅
订阅专栏


前言

在前面的文章中我们都只使用到了.c文件作为依赖但是在实际的工程中肯定是不可能只有.c文件的还存在.h文件,那么在包含了.h文件后又该如何来包含依赖关系呢?

一、makefile不包含.h依赖的后果

首先先在目录下新建四个文件夹,其中就包含了fun.h这个文件。
在这里插入图片描述
makefile:

OBJS := fun.o main.o 

hello : $(OBJS)
	gcc -o $@ $^

$(OBJS): %.o : %.c
	gcc -o $@ -c $^

运行结果:
通过运行结果可以发现不包含.h文件的依赖,将没有办法找到头文件。
在这里插入图片描述
那么这样就需要将头文件包含进来:
将头文件的依赖包含进来后就能够成功编译。

OBJS := fun.o main.o 

hello : $(OBJS)
	gcc -o $@ $^

$(OBJS) : %.o : %.c fun.h
	gcc -o $@ -c $<

那么这也带来了一个问题,这里是只有一个.h头文件,在实际项目中肯定会有成千上万的头文件,当有很多头文件时也是需要一个个来进行添加吗?这样添加肯定会导致makefile的移植性降低,而且不容易维护。
那么如何自动的生成依赖关系呢?下面先做一些预备知识,我们这篇文章将会完成自动生成依赖关系。

二、gcc -M 和 gcc -MM命令

gcc -M命令会根据输入的源代码文件,输出这个源文件及所包含的头文件清单。例如,下面的命令会输出main.c文件及其相关的头文件清单:

在这里插入图片描述

gcc -MM命令与gcc -M命令类似,但会自动忽略掉标准库的头文件。例如,下面的命令会输出main.c文件及其相关的头文件清单(忽略标准库的头文件):
在这里插入图片描述

三、sed命令

sed是一种流文本编辑器,常用于在Linux系统中进行文本处理。sed可以对文本文件进行修改、替换、删除、添加等操作。使用sed命令可以方便地批量处理大量的文本文件。

sed命令的基本用法如下:

sed options ‘commands’ file

其中,options是sed的选项,'commands’是需要执行的命令(可以是多个命令),file是需要处理的文件名。如果没有指定文件名,sed命令会从stdin中读取文本。

常用的sed命令如下:

替换文本
sed ‘s/原文本/新文本/’ file

这个命令将会把file文件中的所有"原文本"替换成"新文本",并输出修改后的文本。如果需要替换所有的原文本,可以在s命令后加上"g"选项,如下所示:

sed ‘s/原文本/新文本/g’ file

删除行
sed ‘行号d’ file

这个命令将会删除file文件中指定行号的内容,并将剩余内容输出。

插入文本
sed ‘行号i\插入文本’ file

这个命令将会在file文件的指定行号前插入一行文本,并输出修改后的文本。

列出行号
sed ‘=’ file

这个命令将会在file文件的每一行前输出行号。

执行脚本
sed -f script.sed file

这个命令将会执行脚本文件script.sed中的命令,对file文件进行处理。

上述仅是sed命令的一部分,sed具有其他更多的选项和用法。在实际应用中,我们可以根据需要灵活运用sed命令,对文本数据进行快速、方便的处理。

下面来使用一下sed命令的修改功能:
在这里插入图片描述

四、makefile中命令的执行机制

在makefile中规则中的每个命令默认是在一个新的进程中执行(shell)

可以通过接续符(;)将多个命令组合成一个命令

组合的命令依次在同一个进程中被执行
下面编写一个makefile验证:


all : 
	mkdir test
	cd test
	mkdir test1

执行结果:
在这里插入图片描述
通过执行结果可以发现test1并不是在test里面创建的,但是我们这样写makefile的本意就是让他在test里面创建一个test1子文件夹,这样的运行结果是为什么呢?这是因为在makefile中规则中的每个命令默认是在一个新的进程中执行(shell)。

要想让这些命令在同一个进程下执行的话可以使用set -e命令。
修改后的makefile:


all : 
	set -e;\
	mkdir test;\
	cd test;\
	mkdir test1

运行结果:
在这里插入图片描述

四、生成依赖文件并单独放入文件夹中

编写下面的makefile为每一个文件都生成对应的依赖,并存放在deps文件夹中。

.PHYON : all clean

CC := gcc
MKDIR := mkdir
RM := rm -rf

DIR_DEPS := deps

SRCS := $(wildcard *.c)
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))

include $(DEPS)

all : 
	@echo all

$(DIR_DEPS) :
	$(MKDIR) $@

$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
	@echo "Creating $@ ..."
	@set -e;\
	$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@


clean :
	$(RM) $(DIR_DEPS)

运行结果:
在这里插入图片描述
在这里插入图片描述

总结

本篇文章讲述了如何自动生成依赖关系这对我们后面项目的构建是非常重要的。

Makefile学习之路11 —— 自动生成依赖关系
weixin_41477765的博客
10-08 211
本文写于 狄泰软件学院 Makefile课程 学后感 编译器的行为缺陷 - 预处理器将头文件中的代码直接插入源文件中 - 编译器只通过预处理后的源文件产生目标文件 - 因此 规则中以源文件为依赖,命令可能无法执行 实验中解决方案的问题 - 当头文件作为依赖条件出现于每个目标对应的规则中 - 当头文件改动,任何源文件都将被重新编译(编...
makefile自动生成依赖
m0_37511026的博客
11-14 695
本文主要参考 Makefile自动生成头文件依赖 和GNU make 中文手册。 虽然签约前向公司里的技术大牛请教时已经被告知 makefile 过时了,不用浪费时间去学习了。但是考虑到作为小白的我,是真的对makefile没什么了解。而不可否认的是,现在makefile依然是学习linux开发绕不过去的一个坎。还是决定花一些时间简单学习一下makefile。 网上关于makefile的资料很
Makefile 自动生成依赖
IT小小鸟
03-25 715
转载自:  http://blog.chinaunix.net/uid-20316928-id-3395996.html 虽然以前对Makefile有个基本概念,但是真正到自己去写一个哪怕是简单的Makefile时也会遇到不少的麻烦。     现在我有如下文件 dList.h dList.c memory.c debug.c debug.h test.c aaron.h 其中包含关系如下:
Linux】在makefile中,引入依赖库和路径的方法
最新发布
Evenurs的url
07-29 1105
本文主要介绍在makefile文件中,如何引入一个库文件参与编译
makefile自动产生依赖
zhongteng的专栏
01-05 7505
makefile自动产生依赖Makefile中,可能需要书写一些规则来描述一个.o目标文件和头文件的依赖关系。例如,如果在main.c中使用“#include defs.h”,那么我们可能需要如下那样的一个规则来描述当头文件“defs.h”被修改以后执行make,目标“main.o”应该被重建。 main.o: defs.h 这样,在一个比较大型的工程中。就需要在Makef
Makefile自动生成头文件依赖
liaojunwu的博客
02-12 3162
【参考博客】: Makefile自动生成头文件依赖_hitwlh的专栏-CSDN博客以makefile编译c工程为例进行解释。在网上搜到的相关教程如下:http://blog.sina.com.cn/s/blog_4b3c1f950102dxh4.htmlhttp://blog.csdn.net/liangkaiming/article/details/6267357http://luzhi1024.blog.51cto.com/8845546/16507https://blog.csdn.net/hit
makefile 自动生成依赖
monkea123的博客
11-14 266
Makefile 中, 我们的依赖关系可能会需要包含一系列的头文件,比如, 如果我们的 main.c 中有一句“#include “defs.h””,那么我们的依赖关系应该是: main.o : main.c defs.h 但是,如果是一个比较大型的工程,你必需清楚哪些 C 文件包含了哪些头文件,并且, 你在加入或删除头文件时,也需要小心地修改 Makefile,这是一个很没有维护性的工作。 ...
Linux gcc/g++ Makefile基础教程.zip
01-09
提供的`Makefile基础教程_C_实验楼 - 实验楼.url`可能指向一个在线学习资源,它提供了关于如何使用`Makefile`进行C语言实践的教程。实验楼通常提供互动式环境,帮助初学者通过实践来掌握编程概念。 9. **Makefile...
makefile基础教程
03-22
其中第5章Makefile规则的书写详细介绍了Makefile规则的列举和语法规则,包括通配符的使用、文件搜寻、伪目标、多目标、静态模式和自动生成依赖性等重要知识点。 第6章Makefile规则中的命令部分,讨论了Makefile命令...
自动生成makefile 最好的教程
12-21
然而,手动编写Makefile可能是一项繁琐的任务,尤其是当项目包含多个源文件和复杂的依赖关系时。幸运的是,有自动化工具可以帮助我们简化这一过程,其中最常用的就是autoconf和automake。 autoconf和automake是GNU...
Makefile中文教程.pdf
03-12
有了makefile,只需运行make命令,即可根据文件依赖关系自动执行编译和链接任务。如果源文件没有改变,make将跳过相应的编译和链接步骤,如果源文件更新了,make将只重新编译必要的文件。 Makefile由一系列规则组成...
makefile自动生成依赖关系
heron804的专栏
04-04 7516
<!-- @page {margin:2cm} p {margin-bottom:0.21cm} code.cjk {font-family:"DejaVu Sans",monospace} code.ctl {font-family:"DejaVu Sans Mono",monospace} --> 手工编写依赖关系不仅工作量大而且极易出现遗漏,更新也很难
由于GNU Make中文手册触发深入理解sed
freeandperson的专栏
05-16 151
最近由于要分析Uboot的代码。 于是乎,再一次开始复习《GNU Make中文手册》() 第一次看这本手册是在快一年前的事情了,当时是啥都不懂。一头雾水。   这次细细品味的时候,发现收获颇多。建议初学者去多看看。   今天看到 《4.14 自动产生依赖》的时候,一段代码在一次让我郁闷了。同样的地方,同样的不理解。 今天偶就要好好揭开这个惑!   代码如下: 1 %.d: %....
Makefile编译原理 自动生成依赖关系_makefile 汇编依赖
efgtrrg的博客
04-05 320
通过 规则中的模式替换 为 func.o main.o 和两个目标生成真真正正的规则。
makefile学习11:自动生成依赖
天泉证道
04-02 457
Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是: main.o : main.c defs.h 但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。为了避免这种繁重而...
make文件自动生成依赖关系
金庆的专栏
10-31 3842
make文件自动生成依赖关系摘自:跟我一起写MakefileMakefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是:    main.o : main.c defs.hC/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命
(8)Linux Makefile | 依赖关系依赖方法
ayf9999的博客
12-18 1877
PHONY是将clean指令修饰成了伪目标不知道你有没有观察到,我们的 makefile 有两个目标文件:我们在 make 的时候,默认只帮我们生成 makefile 中的 test.c 目标文件。为什么 make 的时候它总是执行第一个呢?makefile 在自顶而下进行形成目标文件时,它可以根据你的需求形成多个目标文件。我们这里有两个目标文件,一个是 test 一个是 clean,凭什么我 make 执行的是 test 而不是 clean?答案很简单,就凭我 test 是在前面写的!
Makefile自动依赖
热门推荐
duanbeibei的专栏
09-10 1万+
  Makefile自动依赖 Makefile生成自动依赖的方法有两种:1.  将所有.o文件的依赖关系写入单独文件,然后在Makefile中调用该文件2.  每个.c文件对应一个.d文件,将依赖关系写入.d文件中  一、对于第一种方法,Makefile的写法如下:#file startCC = gccSRCS := $(wildcard *.c)O
写文章

热门文章

  • STM32智能小车循迹教程 28292
  • if、else、else if使用方法 18674
  • C语言中常见的表达式 17898
  • STM32 使用SYN6288语音模块 16568
  • STM32cubeMX配置FreeRTOS 14164

分类专栏

  • STM32框架式编程 付费 41篇
  • 嵌入式面试刷题 付费 19篇
  • GD32全面教程 付费 7篇
  • 深入操作系统 付费 1篇
  • 蓝桥杯嵌入式 付费 26篇
  • 51单片机模块化 付费 6篇
  • Linux网络编程实战 21篇
  • 笔记 1篇
  • QT项目实战 15篇
  • Linux内核分析 8篇
  • C++零基础教程 14篇
  • C语言项目教程 2篇
  • QT实战教学 30篇
  • C语言进阶教程 21篇
  • opencv实战 6篇
  • FreeRTOS全系列教程 24篇
  • STM32物联网 2篇
  • RT-Thread 7篇
  • Linux MQTT智能家居项目 8篇
  • sqlite数据库 2篇
  • STM32 proteus教程 5篇
  • Makefile 13篇
  • 单片机入门 37篇
  • Linux系统编程 24篇
  • C++设计模式 2篇
  • Linux零基础训练营 11篇
  • C语言0基础全面教程 18篇
  • Linux驱动开发 4篇
  • C语言数据结构 1篇
  • Linux 26篇
  • STM32智能家居 7篇
  • 51单片机入门 10篇
  • C加加教程解析 6篇
  • C语言入门保姆级教程 26篇
  • MM32开发教程 1篇
  • RTOS操作系统 8篇
  • 蓝桥杯 3篇

最新评论

  • STM32 proteus + STM32Cubemx仿真教程(第四课串口教程)

    qustwsc: #if 1 #pragma import(__use_no_semihosting) //???????? struct __FILE { int handle; }; FILE __stdout; //????fputc?? int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0); USART1->DR = (uint8_t) ch; return ch; } #endif 這串放到主函數裏

  • STM32 proteus + STM32Cubemx仿真教程(第四课串口教程)

    m0_62169611: STM32仿真串口

  • C语言零基础教程(memset,memcpy函数,memmove函数)

    TiaCoder: memset常和sizeof结合使用,给数组赋值,比如memset(arr, 0x3F, sizeof(arr));给数组近似赋值正无穷

  • 蓝桥杯单片机快速得奖方法(分享一些实用技巧)

    m0_73306038: 蓝桥之路这本书真的有用吗

  • QT串口助手(实现数据的收发功能)

    追风筝的张先森: SerialPort是他新定义的一个类,和QSerialPort不是同一个

最新文章

  • USB中的传输和事务
  • USB数据格式
  • USB的电气特性
2024
09月 11篇
08月 14篇
07月 8篇
06月 7篇
05月 10篇
04月 13篇
03月 2篇
02月 10篇
2023年279篇
2022年94篇
2021年22篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落已飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家楚雄玻璃钢雕塑商家玻璃钢仿真植物水果雕塑制造商余杭玻璃钢造型雕塑黑龙江园林玻璃钢动物雕塑肇东玻璃钢雕塑厂玻璃钢雕塑模型图片猪陕西动物玻璃钢雕塑图片玻璃钢雕塑有什么功效龙泉玻璃钢雕塑设计安顺玻璃钢商场美陈韶关玻璃钢园林雕塑造型新密花朵玻璃钢人物雕塑厂家北京走廊商场美陈销售企业新郑室内玻璃钢仿铜雕塑公司陕西人物校园玻璃钢景观雕塑龙岗玻璃钢雕塑厂家泰佳成玻璃钢雕塑晋城附近玻璃钢仿铜雕塑贵阳玻璃钢小品雕塑温州玻璃钢雕塑定做品牌企业商场圣诞为什么要做美陈江苏玻璃钢雕塑方案凉山商场美陈花器雕塑玻璃钢现场考察场地报告彩色玻璃钢人物雕塑玻璃钢雕塑优质商品批发深圳玻璃钢酒瓶雕塑云南玻璃钢马雕塑制作金华玻璃钢雕塑厂家景观玻璃钢雕塑报价单香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化