使用 gcc -MM 标志在单个文件中生成所有项目依赖项

2024-01-15

我想通过 Makefile 使用 gcc -M 标志生成一个包含源文件的所有依赖项的单个依赖项文件。我用谷歌搜索了这个解决方案,但是,提到的所有解决方案都是为多个对象生成多个 deps 文件。

DEPS = make.dep

$(OBJS): $(SOURCES)
    @$(CC) -MM $(SOURCEs) > $(DEPS)
    @mv -f $(DEPS) $(DEPS).tmp
    @sed -e 's|.$@:|$@:|' < $(DEPS).tmp > $(DEPS)
    @sed -e 's/.*://' -e 's/\\$$//' < $(DEPS).tmp | fmt -1 | \
      sed -e 's/^ *//' -e 's/$$/:/' >> $(DEPS)
    @rm -f $(DEPS).tmp

但它无法正常工作。请告诉我哪里出错了。


我用这些方法将所有依赖项放在一个文件中:

program_H_SRCS := $(wildcard *.h)
program_C_SRCS := $(wildcard *.c)
DEPS = make.deps

make.deps: $(program_C_SRCS) $(program_H_SRCS)
    $(CC) $(CPPFLAGS) -MM $(program_C_SRCS) > make.deps

include $(DEPS)

这基本上会导致每当修改项目中的任何 C 或 H 文件时,所有用户(而不是系统)依赖项都会重新构建到单个文件中。

+++++++++ 编辑 +++++++++++

从那以后我找到了更好的做事方式。我为每个源文件生成一个单独的 dep 文件。这是基本的 makefile:

program_NAME := myprogram
program_SRCS := $(wildcard *.c)
program_OBJS := ${program_SRCS:.c=.o}
clean_list += $(program_OBJS) $(program_NAME)

# C Preprocessor Flags
CPPFLAGS += 
# compiler flags
CFLAGS += -ansi -Wall -Wextra -pedantic-errors

.PHONY: all clean distclean

all: $(program_NAME)

clean:
    @- $(RM) $(clean_list)

distclean: clean

# Generate dependencies for all files in project
%.d: $(program_SRCS)
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@

clean_list += ${program_SRCS:.c=.d}

$(program_NAME): $(program_OBJS)
    indent -linux -brf $(program_SRCS)
    splint $(program_SRCS)
    $(LINK.c) $(program_OBJS) -o $(program_NAME)

ifneq "$(MAKECMDGOALS)" "clean"
# Include the list of dependancies generated for each object file
-include ${program_SRCS:.c=.d}
endif

这有两件事:

  1. 如果 foo.c 依赖的任何文件发生更改,则重建 foo.o,而无需重建项目中的其他文件。
  2. dep 文件本身与目标文件具有相同的依赖关系,因此,如果任何 dep 被修改,则在检查目标文件 deps 之前,dep 文件本身也会重新生成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gcc -MM 标志在单个文件中生成所有项目依赖项 的相关文章

随机推荐

  • HandlerRegistration 的 gwt 问题

    我有个问题 我有一张地图并添加了 ClickHandler 但按下按钮后我想将其删除 我知道有一些 HandlerRegistration 但我不知道如何使用它 我的代码的一部分 map addMapClickHandler new Map
  • Boost 是否曾在受监管项目(FDA、FAA)中使用过?

    在最近发表评论时 我发现自己评论说 根据我的经验 Boost 并未在受监管行业 FDA FAA 广泛使用 事实上 我不知道有任何项目使用过它或已经使用过它 但我意识到我在这里可能缺乏经验 所以我想知道是否anybody了解在医疗设备或航空飞
  • 使用 Python 删除小单词

    是否可以使用正则表达式删除文本中的小单词 例如 我有以下字符串 文本 anytext in the echo chamber from Ontario duo 我想删除所有 3 个字符或更少的单词 结果应该是 echo chamber fr
  • Ionic 框架resolveLocalFileSystemURL 是异步的吗?

    我正在从 AngularJS 控制器调用一个函数 当函数完成执行时 我想在函数调用后打印结果 这段代码在控制器内部 称为on tap count the number of files inside a directory var coun
  • 如何在颤振中仅将一个元素集中在一行2个元素中

    在我的布局中 我有两个连续的小部件 一个文本和一个图标 如下所示 假设 代表图标 用 代表行 Text 如何使文本在整行居中 图标在右端 您需要注意的主要事情是 如果您不想使用Stack您应该在左侧和右侧提供相同的宽度消耗小部件 我会这样做
  • 使用特定的 Visual Studio 项目构建配置来运行单元测试

    我的公司已经拥有 Team Foundation Server 作为持续集成平台 但是 我想要设置的是开发人员可以在自己的开发计算机上运行的构建配置 假设我有一个包含 NET C 类库项目 我将其称为库项目 的 Visual Studio
  • 如何在 HTML 中制作垂直旋转的链接?

    我正在努力实现这一目标 用这个代码 div a href class a1 span Dnes span a a href class a2 selected span Z tra span a a href class a3 span P
  • 相对文件路径在 Eclipse 中如何工作?

    所以我2009年的新年决心就是学习Java 我最近获得了 Java for Dummies 并一直按照书中的演示代码使用 Eclipse 重新编写它 无论如何 书中使用相对路径的每个示例似乎都没有读取它应该读取的 txt 文件 这是示例代码
  • 对 Java 字符串使用 '==' 而不是 .equals [重复]

    这个问题在这里已经有答案了 可能的重复 是什么让引用比较 对 Java 中的某些字符串起作用 https stackoverflow com questions 9698260 what makes reference comparison
  • Scala 中的“new”关键字

    我有一个非常简单的问题 在 Scala 中创建对象时我们什么时候应该应用 new 关键字 是当我们只尝试实例化 Java 对象时吗 Use the new当你想引用一个关键字时class自己的构造函数 class Foo val f new
  • JavaScript Safari - 语法错误:意外的标记“>”

    我遇到的问题是这个 JavaScript 代码片段在 Firefox Chrome 中运行没有任何问题 而在 Safari 中我收到错误 SyntaxError Unexpected token gt 这是代码 window onclick
  • 将修改后的破折号数据表保存到数据框

    我是 dash 的新手 我正在努力将 dash 数据表上所做的编辑保存回数据框 这是我的数据表代码 import dash from dash dependencies import Input Output State import da
  • “未定义的函数引用”错误

    我在使用标头编译一些文件时遇到一些问题 这是我的代码的细分 file1 c include header h int main func1 return 0 file2 c include header h void func1 funct
  • 响应式网站无法在 IE 中工作(尽管有 css3-mediaqueries.js)

    我正在创建一个响应式网站 但似乎无法让它在 IE 中工作 我正在 IE8 中进行测试 现在 我知道 Internet Explorer 8 及更低版本不支持 CSS3 媒体查询 但我包含了 css3 mediaqueries js Java
  • 在 Windows 上编译 GTK+ 应用程序?

    我正在关注这个thread https stackoverflow com questions 1450445 installing gtk and compiling using gcc under windows为了学习 gtk 但我似
  • CURL 请求中的 GET 方法是否有 CURLOPT_POSTFIELDS 等效项?

    我想使用 GET 方法执行带有参数和值的 CURL 请求 但我不想在传递给 curl 之前混合它们 就像在字符串中一样 www example com index php parameter value 我想将单独的 url 字符串和查询字
  • 如何获取任何 Discord 服务器的成员总数?

    我正在尝试构建一个抓取脚本来获取一堆 Discord 服务器的全部成员 实际上 我是用 Puppeteer 这样做的 如下所示 但我认为我的 IP 地址已被禁止 因为即使邀请链接有效 我也会收到来自 Discord 的 邀请无效 错误 我的
  • 从 Mac 上的 git 存储库中删除奇怪的文件

    我最近尝试将 OpenEars 框架添加到我的 xcode 项目中 当我尝试将我的项目提交到存储库时 出现以下错误 错误 pathspec Framework Icon r 与 git 已知的任何文件都不匹配 我尝试使用 xcode 中的导
  • Java 7 switch 语句与字符串不起作用

    根据Java 教程 http download oracle com javase tutorial java nutsandbolts switch html in Java SE 7 http jdk7 java net downloa
  • 使用 gcc -MM 标志在单个文件中生成所有项目依赖项

    我想通过 Makefile 使用 gcc M 标志生成一个包含源文件的所有依赖项的单个依赖项文件 我用谷歌搜索了这个解决方案 但是 提到的所有解决方案都是为多个对象生成多个 deps 文件 DEPS make dep OBJS SOURCE