在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
如果-MD与-E一起使用,则任何-o开关都应理解为指定
依赖项输出文件(参见-MF),但如果在没有-E的情况下使用,则每个-o应理解为
指定目标对象文件。由于未暗示-E,因此-MD可用于生成依赖性输出文件 编译过程的副作用。
我没有使用-E
,所以不应该给我一个目标文件和一个依赖项输出文件?如何确定问题所在?
答案 0 :(得分:2)
删除-M
和-MG
选项。来自gcc联机帮助页:
将-M传递给驱动程序意味着-E,(...)
..而-MG
需要-M
,因此您无法保留它。这不应该是一个问题,因为-MG
只有在生成的头文件仍然缺失的情况下才有用,在这种情况下,无论如何你都无法编译代码。