我广泛使用 C++11,因此在安装新的 Xubuntu 12.04 LTS 版本后,我立即从源代码构建了 gcc。在使用获取所需的依赖项后sudo apt-get build-dep gcc-4.7-base
,我在 Subversion 中签出了 gcc 的 4.7.0 标签并开始构建它。
在我的 64 位笔记本电脑上,--disable-multilib --enable-libstdcxx-time=rt --enable-languages=c,c++
尽管安装了该软件包,但构建(配置为)仍找不到与 libc6-dev 相关的文件。我只能按照 StackOverflow 帖子的建议,通过将 /usr/lib64 软链接到 /usr/lib/x86_64-linux-gnu 来修复该问题。之后,gcc 成功构建,安装后似乎运行良好。
我的 32 位桌面系统则是另一回事。我遇到了同样的初始问题,gcc 构建链找不到 libc6-dev 文件。最后,我不得不导出以下环境变量才能正确构建(这个想法来自这里):
export LIBRARY_PATH=/usr/lib/i386-linux-gnu/
export C_INCLUDE_PATH=/usr/include/i386-linux-gnu
export CPLUS_INCLUDE_PATH=/usr/include/i386-linux-gnu
希望这能解决我的问题,我去尝试新安装的 gcc 版本,但当我尝试的第一个项目(从源代码构建最新版本的 vim)上它立即失败了。它找不到 gcc 版本找不到的相同文件,并在一系列错误中失败之前发出以下消息:
嗯,sed 对您的系统头文件非常悲观。但是它没有转储核心——奇怪!让我们小心地继续...如果失败了,您可能需要从 osdef.h 中删除有问题的行,或者尝试使用空的 osdef.h 文件(如果您的编译器可以不使用函数声明)。
当我把这个悲惨的故事带到 gcc IRC 频道时,那里的几个人表达了对 Ubuntu 的沮丧,并告诉我这些错误是由 Ubuntu 12 更改了长期存在的文件路径引起的。
有人可以解释一下这个问题吗?
答案1
正如我在评论中所说,问题不在于漏洞在 GCC 或 Ubuntu 中,但有一个不兼容的功能:多架构。多架构的目的是允许多个架构的二进制文件同时安装在同一文件系统中而不会发生冲突。这将取代过去存在的旧 32 位与 64 位库系统,但在我们想要同时安装 Intel 和 ARM 时,这实际上更为重要。对于台式计算机来说,这可能不是很有趣,但 Ubuntu 存在于许多嵌入式设备中(或将存在),它们可能会做这种事情。
进行这样的更改自然会导致文件被移动,因此我们可以预料到在切换期间会出现一些中断。GCC 目前还不支持新位置,但最终会支持。
从标准桌面安装开始,这些设置步骤使构建能够为我工作:
amd64 (我测试过这个):
sudo -i
# apt-get install libppl0.11-dev libmpfr-dev libgmp-dev libc6-dev-i386
# cd /usr/include
# ln -s x86_64-linux-gnu/* .
# cd /usr/lib
# ln -s x86_64-linux-gnu/crt* .
我看到您使用的是 32 位 Ubuntu。我还没有测试过,但我做了一些明显的更改。
ix86:
sudo -i
# apt-get install libppl0.11-dev libmpfr-dev libgmp-dev libc6-dev
# cd /usr/include
# ln -s i386-linux-gnu/* .
# cd /usr/lib
# ln -s i386-linux-gnu/crt* .
警告:插入软链接是通常对于大多数人来说,这是无害的,但可能会在以后给您带来麻烦。(主要是当您想在同一台机器上同时构建 64 位和 32 位项目时。)