gcc 一起构建对象和依赖文件

gcc build object and dependency files together

在 Ubuntu 上使用 gcc 4.7.2,我正在使用此命令编译一些源文件:

g++ -c -o obj/foo.o foo.cpp -O0 -Wall [.. lots of other args .. ]

这很好用,给了我一个合理的目标文件,obj/foo.o。但是,如果我想同时生成依赖文件:

g++ -c -o obj/foo.o foo.cpp -O -Wall [ .. ] -M -MD -MG -MP -MF obj/foo.dep

然后当我得到一个完全合理的外观 obj/foo.dep 时,我得到一个空的 obj/foo.o。也根本没有编译输出。查看 documentation,这似乎应该可行:

-MD
    If -MD is used in conjunction with -E, any -o switch is understood to specify the
    dependency output file (see -MF), but if used without -E, each -o is understood to
    specify a target object file.

    Since -E is not implied, -MD can be used to generate a dependency output file as
    a side-effect of the compilation process.

我没有使用 -E,所以这不应该给我一个目标文件和一个依赖输出文件吗?我怎样才能确定问题出在哪里?

删除 -M-MG 选项。来自 gcc 联机帮助页:

Passing -M to the driver implies -E, (...)

..而-MG需要-M,所以你不能保留它。这应该不是问题,因为 -MG 仅在生成的头文件仍然丢失时才重要,在这种情况下,无论如何您都无法编译代码。