我正在使用gcc 4.8.2,我正在尝试同时构建目标文件和依赖文件。
这有效:
$ g++ -std=c++11 -MP -MD -c foo.cxx -o foo.o
$ [ -s foo.d ] && [ -s foo.o ] && echo yay
yay
但是,我想生成foo.d
而不是生成foo.D
,所以我尝试了:
$ rm foo.d foo.o
$ g++ -std=c++11 -MP -M -MF foo.D -c foo.cxx -o foo.o
$ [ -s foo.D ] && [ -s foo.o ] && echo yay
$
成功生成foo.D
,但空foo.o
。为什么? -MD
的{{3}}以:
-MD相当于-M -MF 文件,但不暗示-E。
答案 0 :(得分:1)
我不知道为什么-M -MF foo.D
不适合你,我的文档阅读与你的相同。我认为应该有效。编译的strace
可能会告诉您一些有趣的事情。
但作为一种解决方案,您只需将-MF foo.D
参数添加到原始命令行即可,并且可以执行您想要的操作。
正如-MF
的文档所说:
-MF文件 与-M或-MM一起使用时,指定要将依赖项写入的文件。如果没有给出-MF开关,则预处理器将规则发送到它将发送预处理输出的相同位置
当与驱动程序选项-MD或-MMD一起使用时,-MF会覆盖默认依赖项输出文件。