目前的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.为什么??
答案 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
结果是:
从我的观点来看,这显然是一个错误:为了获得清晰的依赖列表,您不仅要以正确的顺序运行参数,还要修剪结果以删除NULL字符及其后的所有内容。
重点是我的版本是g++ (Debian 4.7.2-5) 4.7.2
,而已有4.8.2
和4.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
文件有一些默认名称。