如何在gcc自动生成的头依赖关系中处理将源代码从C移动到C++



我们有一个项目,它正在慢慢地从C迁移到C++。它使用GNU Make作为构建系统。我们使用GCC-M标志来生成对标头的依赖关系。

生成依赖关系时,GCC会将源文件和所有需要的标头添加到依赖关系列表中。要解决标头删除问题,有-MP标志。但当源文件从.c扩展名移动到.cpp扩展名时(或在分支之间切换时向后移动),它并不能修复错误,因为仍然存在对.c的自动生成依赖,而这种依赖已不存在。

我想出了一些方法来修复它,但所有的接缝都有点粗糙:

  1. 迁移时始终更改文件名
  2. 根据语言在具有依赖项的文件上生成不同的名称
  3. 通过自己的脚本重写生成的依赖项
  4. 添加目标以忽略依赖项中所有缺少的.c/.cpp

我错过了一些简单的修复吗?

小示例:

-include a.d
%.o: %.c
gcc -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<
%.o: %.cpp
g++ -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<
a: a.o
g++ a.o -o a

在上述情况下,如果从a.c编译,然后移动a.c->a.cpp

make:***没有规则使目标"a.c"成为"a.o"所需的目标。停止。

将引发错误。但清理后的构建将正常通过。

第二个选项(基于输入文件名的.d文件名,而不是输出文件名)似乎是最常用的选项。也就是说,使用-MF $@.d而不是-MF $*.d

如果当前将对象文件列为依赖项,则可以将其切换为源文件列表,从中使用$(patsubst …)生成对象文件列表。(这假设源文件具有常规名称或位置,这些名称或位置指示将要使用对象文件的位置。)或者,您可以使用$(wildcard …)从源树自动获取列表,或者使用从版本控制系统的签入文件列表生成的清单文件。

最新更新