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

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

前言

在前面的文章中我们都只使用到了.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)

运行结果:


总结

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

相关文章
|
存储 编译器 C语言
Makefile基础教程(变量的介绍和使用)
Makefile基础教程(变量的介绍和使用)
341 0
|
测试技术 Linux API
mutagen-处理音频元数据的Python模块
Mutagen是处理音频元数据的Python模块。它支持ASF,FLAC,MP4,Monkey's Audio,MP3,Musepack,Ogg Opus,Ogg FLAC,Ogg Speex,Ogg Theora,Ogg Vorbis,True Audio,WavPack,OptimFROG和AIFF音频文件。支持所有版本的ID3v2,并解析所有标准的ID3v2.4帧。它可以读取Xing标头,以准确计算MP3的比特率和长度。无论音频格式如何,都可以编辑ID3和APEv2标签。它还可以在单个数据包/页面级别上处理Ogg流。
2876 0
mutagen-处理音频元数据的Python模块
|
Ubuntu 网络安全 数据安全/隐私保护
使用MobaXterm ssh远程登录Ubuntu 20.04
接着等待安装完成。 再次输入ifconfig,可以看到我们的ip是192.168.197.139。
2353 0
HTML 标签简写及全称
本文列举了常见的HTML标签及其英文全称和中文解释,包括锚、缩写词、地址、粗体、区块引用、换行、段落、标题、水平尺、超文本引用等,帮助读者快速了解和使用这些标签。
|
11月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
310 1
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
|
存储 运维 负载均衡
解析iptables原里及设置规则
【4月更文挑战第21天】本文就是针对对iptables了解不多,需要知道其基本原理,数据包处理流向及常用的配置设置等进行总结叙述,以达到在最短的时间内找到所需求的知识,进行常规配置操作。
399 4
解析iptables原里及设置规则
|
前端开发
content-box和border-box是什么?
content-box和border-box是什么?
672 0
|
存储 Oracle 关系型数据库
【数据库-DB2】深入了解DB2 reorg
本文介绍了DB2数据库中reorg操作的重要性,旨在通过重组表数据来消除数据碎片、压缩信息并提高数据访问速度。reorg操作能够根据索引关键字重新排序数据,减少查询I/O次数,提升查询性能。文章详细讲解了reorg的操作步骤、适用场景及注意事项,强调了在执行reorg前后更新统计信息的必要性。
907 2
|
机器学习/深度学习 前端开发 JavaScript
230+本图灵编程高清文字版无水印电子书合集【制作不易,点赞收藏❤️】
今日精选,200余本图灵出版的高质量编程电子书,覆盖编程、系统架构、算法及机器学习等热门领域,助你全面提升技术能力。无论你是初学者还是资深开发者,都能从中找到适合自己的学习资源,从《Python编程:从入门到实践》到《深度学习入门》,每一本书都将是你技术成长道路上的良师益友,帮助你在瞬息万变的技术浪潮中站稳脚跟,稳步前行。
541 2
|
机器学习/深度学习 人工智能 芯片
【AI系统】超异构计算
本文探讨了计算机架构发展的黄金十年,重点介绍了异构计算和超异构计算的概念及其在AI芯片发展中的应用。文章首先回顾了AI芯片发展的三个阶段,随后详细阐述了异构计算的优势和应用场景,如性能飞跃、灵活定制、降低成本和降低功耗。接着,文章分析了超异构计算的出现背景、基本特征及其面临的挑战,包括软件层的复杂性和硬件定义软件与软件定义硬件之间的权衡。最后,展望了超异构计算的未来,强调了跨平台统一计算架构的重要性,以及构建开放生态系统的必要性。
770 5

热门文章

最新文章