gpt4 book ai didi

c++ - GCC -E -MD 有错误还是我遗漏了什么?

转载 作者:太空狗 更新时间:2023-10-29 23:16:57 25 4
gpt4 key购买 nike

当前的 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. 为什么?

最佳答案

我尝试重复您执行的步骤。我用这个例子来检查一下:

// 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.2这样的版本4.9.0(开发中)。如果这些版本也有此错误,您可以自由地让他们知道他们有 Unresolved 问题。

编辑

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

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 文件。

关于c++ - GCC -E -MD 有错误还是我遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21211569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com