g++默认头文件包含列表

5
在 Linux 机器(lubuntu 11.10)上使用交叉编译的 g++ 进行编译时,在详细模式下,我可以看到默认包含头文件目录的列表:
#include <...> search starts here:
/opt/eldk-4.2/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include
/opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/powerpc-linux
/opt/eldk-4.2/ppc_4xx/usr/include/c++/4.2.2/backward
/opt/eldk-4.2/usr/../ppc_4xx/usr/include

在另一台Linux机器(lubuntu 12.10)上执行相同的g ++二进制文件,我得到另一个不同的列表,其中元素较少:

#include <...> search starts here:
/opt/eldk-4.2/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include

其中一些元素似乎构造不佳,例如以下内容:

ignoring nonexistent directory "/opt/ppc_4xx/usr/lib/gcc/powerpc-linux/includ../include/c++/4.2.2"

结果是,一些在第一个系统上编译的代码在第二个系统上无法编译,因为找不到某些头文件。
为什么会发生这种情况?这个列表从哪里来?谁负责构建它?是否可以轻松更改它?
感激任何帮助。

1
g++ -v -H 的方式运行它,它会告诉你很多信息... - Basile Starynkevitch
2个回答

5

不幸的是,我不知道默认目录存储在哪里。它们可能已经内置于编译器中。 - Rafał Rawicki
我怀疑它没有存储在编译器中,因为在不同的机器上执行相同的二进制文件会产生不同的结果。 - Marda
1
它是内置于编译器中的,但路径是相对路径,因此它们相对于二进制文件安装的位置而言是相对的。 - Jonathan Wakely

1

我在使用ELDK 4.2时遇到了完全相同的问题。这很可能与Ubuntu 12.04中的某些更改有关,因为我之前在同一台计算机上升级之前已经成功运行了编译器。

我的问题是似乎忘记了/usr目录

忽略不存在的目录“/opt/eldk-4.2/../ppc_82xx/usr/include”

应该是

/opt/eldk-4.2/usr/../ppc_82xx/usr/include

这在Ubuntu 11.10上完美运行。

我尝试过从ISO安装ELDK,也尝试过从Ubuntu 11.10的工作版本复制安装。


1
我找到了这个,http://answerpot.com/showthread.php?3533926-Ubuntu+12.04+and+ELDK+4.1 - Niclas Lindgren
我通过向规范文件添加缺失的路径来“解决”我的问题。这是一个hack,但是可以解决问题。http://www.mingw.org/node/25。值得注意的是,ELDK 4.2在我升级自11.04的ubuntu映像上工作,但在新安装的12.04上不起作用。路径和链接的解析存在某种不兼容性。我猜测,如果一个目录没有以/结尾,它将在某个库中的某个地方产生不同的结果。 - Niclas Lindgren
我不确定那是一个黑客行为 - 这里需要一个解决方案,使构建环境与其主机隔离 - 否则构建将无法重复。必须为您的工具配置一个可以与项目一起进行版本控制的环境配置。事实上,对您的工具进行版本控制也是一个好计划。 - marko
问题在于它应该已经工作了。我认为根本问题是ELDK是使用动态库构建的。因此,当主机更新时,可能会遇到问题。我确信这是因为Ubuntu 12.04已经将libc更新到2.15。即使您对规范应用了上述更改(通常情况下不需要,因为路径是相对于gcc二进制文件找到的),在12.04下编译器尝试查找软链接的.so库时,仍会遇到其他问题。因此,现在我建议使用早期版本的Ubuntu。 - Niclas Lindgren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接