我们有一个项目,该项目现在正从C缓慢地迁移到C ++。它使用GNU Make
作为构建系统。我们使用GCC
-M标志来生成对标头的依赖性。
生成依赖项时,GCC
将源文件和所有必需的标头添加到依赖项列表。要解决标题删除问题,请使用-MP标志。但是,当源文件从.c扩展到.cpp扩展名(或在分支之间切换时返回)时,它不能解决错误,因为仍然存在对.c的自动生成的依赖性,这种依赖性已不复存在。
我想出了一些方法来修复它,但是所有缝隙都有些古怪:
我错过了一些简单的解决方法吗?
小例子:
-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”。停止。
将引发错误。但是经过干净的构建将正常通过。
答案 0 :(得分:0)
第二个选项(将.d
文件名基于输入文件名,而不是输出文件名)似乎是最常用的选项。也就是说,使用-MF $@.d
代替-MF $*.d
。
如果当前将目标文件列出为依赖项,则可以将其切换为源文件列表,然后使用$(patsubst …)
从中生成目标文件列表。 (这假设源文件具有常规名称或位置,这些常规名称或位置指示将在何处使用目标文件。)或者您可以使用$(wildcard …)
从源树自动获取列表,或使用生成的清单文件从版本控制系统的签入文件列表中。