GCC -E -MD有错误还是我错过了什么?

时间:2014-01-19 00:10:09

标签: c++ gcc

目前的GCC手册说

“如果-MD与-E一起使用,则任何-o开关都被理解为指定依赖项输出文件”

这不是我所看到的:

>echo -n > dir/foobar.cpp
>g++ -E -MD -c dir/foobar.cpp -o dir/foobar.o
>cat dir/foobar.o
# 1 "dir/foobar.cpp"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "dir/foobar.cpp"

dir/foobar.o没有依赖项信息,但只是预处理结果。

问题1.为什么?

此外,如果是这样,我仍然期望,dir/foobar.d将是正确的依赖信息。它不是:

>cat dir/foobar.d
foobar.o: dir/foobar.cpp /usr/include/stdc-predef.h

它应该是dir/foobar.o: ...当我不使用-E时就是这样 - 但是使用-E时,目录前缀将被删除。

问题2.为什么??

1 个答案:

答案 0 :(得分:0)

我试图重复你所做的步骤。我用这个例子来检查一下:

// test.cpp
#include "boost/bimap.hpp"
#include "boost/container/map.hpp"
#include "boost/container/vector.hpp"

int main(int argc, char* argv[]) {
    boost::bimap<int,int>          b;
    boost::container::map<int,int> m;
    boost::container::vector<int>  v;
    return 0;
}

然后我尝试运行以下命令:

g++ -MD -E -o test.d test.cpp

结果是处理后的输出。另一方面,当我运行此命令时:

g++ -MD -E test.cpp -o test.e

结果是:

  • 依赖项列表,如makefile后跟,
  • 整行NULL字符后跟
  • 未完成的预处理结果。

从我的观点来看,这显然是一个错误:为了获得清晰的依赖列表,您不仅要以正确的顺序运行参数,还要修剪结果以删除NULL字符及其后的所有内容。

重点是我的版本是g++ (Debian 4.7.2-5) 4.7.2,而已有4.8.24.9.0等版本(正在开发中)。如果这些版本也有这个bug,你可以自由地让他们知道他们有一个未解决的问题。

修改

关于你的第二个问题,我收到了这样的话:

test.o: Workspaces/test.cpp /usr/include/boost/bimap.hpp \
 /usr/include/boost/bimap/bimap.hpp /usr/include/boost/config.hpp \
 /usr/include/boost/config/user.hpp \ 
...
和你一样。我认为问题是,您只将这两个文件名作为参数传递:源文件名和输出文件名。输出名称仅描述当前结果的位置,而不是如何命名.o文件:

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

来自here

所以你基本上要么指定目标文件(没有-E),要么指定依赖文件(带-E),然后g ++假定.o文件有一些默认名称。