如何处理gcc自动生成的标头依赖项中从C到C ++的源代码迁移?

时间:2019-01-04 12:50:58

标签: gcc g++ gnu-make

我们有一个项目,该项目现在正从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并随后移动a.c-> a.cpp

  

make:***没有规则将目标“ a.c”设为“ a.o”。停止。

将引发错误。但是经过干净的构建将正常通过。

1 个答案:

答案 0 :(得分:0)

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

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