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

在Makefile中如何使用.d文件?

在自动生成依赖关系是要使用.d文件请问怎么使用该文件-include$(DEPS)#DEPS是指定的.d文件的变量当Makefile包含了.d文件之后什么也没做呀,.d文件是怎么起作用的?如
在自动生成依赖关系是要使用.d文件请问怎么使用该文件
-include $(DEPS)
#DEPS是指定的.d文件的变量
当Makefile包含了.d文件之后什么也没做呀,.d文件是怎么起作用的?
如下有一个Makefile
     
    EXECUTABLE := mushroom.exe 
    LIBS := alleg  
     
    CFLAGS := -g -Wall -O3 -m486 
    CXXFLAGS := $(CFLAGS) 
    
    RM-F = rm -f 
     
    SOURCE := $(wildcard *.c) $(wildcard *.cc)  
    OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE))) 
    DEPS := $(patsubst %.o,%.d,$(OBJS))  
    MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))  
    MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \ 
    $(patsubst %.d,%.cc,$(MISSING_DEPS))) 
    CPPFLAGS += -MD 
    .PHONY : everything deps objs clean veryclean rebuild 
     
    everything : $(EXECUTABLE) 
     
    deps : $(DEPS) 
     
    objs : $(OBJS) 
     
    clean : 
     @$(RM-F) *.o 
     @$(RM-F) *.d 
     
    veryclean: clean 
     @$(RM-F) $(EXECUTABLE) 
     
    rebuild: veryclean everything 
     
    ifneq ($(MISSING_DEPS),) 
    $(MISSING_DEPS) :  
       @$(RM-F) $(patsubst %.d,%.o,$@) 
    endif 
     
    -include $(DEPS) 
     
    $(EXECUTABLE) : $(OBJS) 
     gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))

###########################################
    deps : $(DEPS) 
     
    objs : $(OBJS)
这两句没有任何命令,是不是使用了隐含规则?
    -include $(DEPS)
只是把.d文件包含进来,这样它就能起作用吗?
还有如果我想不生成的.o .d文件放到别的文件夹里或者原文件不在当前目录下那上面两句还能好用吗?

9 个解决方案

#1


.d文件里包含了目标文件的所有依赖.
比如: test.c 里包含a.h a1.h a2.h a3.h a4.h 头文件.这些都是目标文件test.o的依赖文件.\
bash-2.05a$ cat test.c
#include 
#include 

#include "a.h"
#include "a1.h"
#include "a2.h"
#include "a3.h"
#include "a4.h"
bash-2.05a$ gcc -MM test.c
test.o: test.c a.h a1.h a2.h a3.h a4.h ==>自动生成依赖文件,不需要手动指定.-MM的时候不显示系统头文件.

#2


自动生成的依赖文件不用包含在makefile中?
     至少我从来没有依赖过.h文件
   
     lz的代码最好弄清楚点。

#3


谢谢楼上的两位
我知道.d文件是包含文件的依赖关系
我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?

#4


建议楼主去看一下<<跟我一起写Makefile>>

#5


-include $(DEPS) 将会把*.d文件里内容插入到Makefile里.
这样的话Makefile就变成这样了:

... ...
test.o: test.c a.h a1.h a2.h a3.h a4.h
xxx.o: xxx.c xxx.h
... ...
这样就可以生成目标文件了。然而$(BIN)需要这些目标文件。

#6


>>>>>我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?
.d 可以是一个临时文件,保存了依赖关系.这些以来关系还是要加到Makefile文件里的.在
使用include将.d文件里内容加到Makefile文件里.

#7


我还有问题
-include $(DEPS) 将会把*.d文件里内容插入到Makefile里.
这样的话Makefile就变成这样了:

... ...
test.o: test.c a.h a1.h a2.h a3.h a4.h
xxx.o: xxx.c xxx.h
... ...
这样就可以生成目标文件了。然而$(BIN)需要这些目标文件
那么make 是不是根据.d中的内容如
test.o: test.c a.h a1.h a2.h a3.h a4.h
在根据隐含规则生成.o文件?
那么我们在Makefile中是不是不需要再写诸如%.o : %.c 等这样的语句了?

#8


不需要.
加入-include $(DEPS)根据隐含规则生成目标文件.
你的makefile是一个通用的makefile.

#9


我有点不明白,既然Makefile文件可以将.d的文件包含进来,为什么还要在源程序包含呢

推荐阅读
  • web页面报表js下载,web报表软件 ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • 本文介绍了如何在 MapReduce 作业中使用 SequenceFileOutputFormat 生成 SequenceFile 文件,并详细解释了 SequenceFile 的结构和用途。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • GDB 使用心得与技巧总结
    在使用 GDB 进行调试时,可以采用以下技巧提升效率:1. 通过设置 `set print pretty on` 来美化打印输出,使数据结构更加易读;2. 掌握常见数据结构的打印方法,如链表、树等;3. 利用 `info locals` 命令查看当前作用域内的所有局部变量;4. 在需要进行类型强制转换时,正确使用语法,例如 `p (Test::A *) pObj`。这些技巧能够显著提高调试的便捷性和准确性。 ... [详细]
  • 本文详细介绍了在DS-5开发工作室中集成最新编译器工具链的方法与步骤。通过逐步指导,帮助用户高效地配置和使用最新的编译器,以提升开发效率和代码质量。此外,还提供了常见问题的解决方案和最佳实践建议,确保用户能够顺利进行开发环境的升级。 ... [详细]
author-avatar
baby欧米茄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有