热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

13.自动依赖生成关系(下)

目录1.问题2.解决思路3.初步的代码设计4.不是问题的问题5.问题本质分析6.解决方案优化7.include暗黑操作一:8.include暗黑操作二

目录

 

1.问题

2.解决思路

3.初步的代码设计

4.不是问题的问题

5.问题本质分析

6.解决方案优化

7.include暗黑操作一:

8.include暗黑操作二

9.include暗黑操作三

10.关于include的总结一

11.关于include的总结二

12.关于include的总结三




1.问题

如何在makefile中组织.dep文件到指定目录?


2.解决思路


  • 当include发现.dep文件不存在:

             1.通过规则和命令创建deps文件

             2.将所有.dep文件创建到deps文件夹

             3..dep文件中记录目标文件的依赖关系


3.初步的代码设计

这样就是先生成dep文件在创建,目录

打开警告,发现include时找不到DEPS目标所以报错,如果不打开-include就会执行all

完善如下,我们使用预定义函数过滤掉目录


.PHONY : all cleanMKDIR := mkdir
RM := rm -fr
CC := gccDIR_DEPS := depsSRCS := $(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)

4.不是问题的问题

为什么有一些.dep依赖文件会被重复创建多次?


5.问题本质分析


  • deps文件夹的时间属性会依赖文件创建而发生改变
  • make发现deps文件夹比对应的目标更新
  • 触发相应规则的重新解析和命令的执行

6.解决方案优化

使用ifeq动态决定.dep目标的依赖

make clean不需要include,完善如下


.PHONY : all cleanMKDIR := mkdir
RM := rm -fr
CC := gccDIR_DEPS := depsSRCS := $(wildcard *.c)
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))all : @echo "all"ifeq ("$(MAKECMDGOALS)", "all")
-include $(DEPS)
endififeq ("$(MAKECMDGOALS)", "")
-include $(DEPS)
endif$(DIR_DEPS) :$(MKDIR) $@ifeq ("$(wildcard $(DIR_DEPS))", "")
$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
else
$(DIR_DEPS)/%.dep : %.c
endif@echo "Creating $@ ..."@set -e; \$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@clean :$(RM) $(DIR_DEPS)

7.include暗黑操作一:

使用减号(-)不但关闭了include发出的警告,同时关闭了错误;当错误反生时make将忽略这些错误!


8.include暗黑操作二

如果include触发规则创建了文件,之后还会发生什么?

答:先执行创建在回去执行all

.PHONY : all-include test.txtall : @echo "this is all"test.txt :@echo "creating $@ ..."@echo "other : ; @echo "this is other" " > test.txt

9.include暗黑操作三

如果include包含的文件存在,之后还会发生什么?

答:将不再执行test这条规则

.PHONY : all-include test.txtall : @echo "this is all"test.txt : @echo "creating $@ ..."

10.关于include的总结一


  • 当目标文件不存在

                   以文件名查找规则,并执行


  • 当目标文件不存在,且查找的规则中创建了目标文件

                  将创建成功的目标文件包好进当前makefile


11.关于include的总结二


  • 当目标文件存在

            将目标文件包含进当前makefile

           以目标文件名查找是否有相应规则


12.关于include的总结三


  • 当目标文件存在,且目标名对应的规则被执行

           规则中的命令更新了目标文件

                  √make重新包含目标文件,替换之前包含的内容

           目标文件未被更新

                  √NULL(无操作)

.PHONY : all-include test.txtall : @echo "$@ : $^"test.txt : b.txt@echo "creating $@ ..."@echo "all : c.txt" > test.txt

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • ubuntu下基于c++的opencv学习
    一、环境配置1、安装opencv2、makefile编写makefile模板,与c文件在同一个目录下,用make指令生成可执行文件,然后运 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 在VC环境中,掌握高效的调试技巧和高级应用对于提高开发效率至关重要。本文详细介绍了如何通过检查程序中的括号匹配来避免常见的语法错误。具体操作包括将光标置于待检测的括号(如大括号 {}、方括号 [] 和圆括号 ())上,系统会自动高亮显示对应的配对括号,从而帮助开发者快速定位和修复问题。此外,文章还探讨了其他实用的调试工具和方法,如断点设置、变量监视和调用堆栈分析,以全面提升代码调试的准确性和效率。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 在无网络环境下于CentOS 7系统中离线部署Nginx服务器
    nginx背景俄罗斯程序员IgorSysoev创建,于2004年NGINX首次发布,来解决C10K问题(10000并发客户端连接到单个服务器,导致服务器连接数过多崩溃的问题),是一 ... [详细]
  • PyFasterRCNN配置详解与优化指南
    本文主要讲解Faster-RCNN的配置过程,以及配置过程中遇到问题的解决方案。 1.下载工程gitclone--recursivehttps:github.comr ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • IIS配置大全:从基础到高级的全面指南
    IIS配置详解:从基础到高级的全面指南IIS前端配置与web.config文件紧密相关,相互影响。本文详细介绍了如何设置允许通过的HTTP请求方法,包括HEAD、POST、GET、TRACE和OPTIONS。提供了两种主要的配置方法,并探讨了它们在实际应用中的优缺点。此外,还深入讲解了其他高级配置选项,帮助读者全面提升IIS服务器的性能和安全性。 ... [详细]
author-avatar
胖蚂蚁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有