我正在尝试使用现代 GCC 在 Centos 6.4 上进行编译。问题是 Centos 没有现代 glibc,GCC 4.8.x 和 4.7.x 不断给我以下编译错误:
... -DL_gcov -c ../../.././libgcc/libgcov.c
In file included from /usr/include/features.h:385:0,
from /usr/include/stdio.h:28,
from ../../.././libgcc/../gcc/tsystem.h:88,
from ../../.././libgcc/libgcov.c:29:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
这里的问题是它gnu/stubs-32.h
是现代的一部分glibc
,而 Centos 6.4 似乎没有它。我尝试过构建自己的glibc
,但一旦安装完成,在我的本地,LD_LIBRARY_PATH
我就无法运行任何其他程序,因为系统上所有现有的可执行文件都试图链接它,但都失败了。
我想使用新的编译器,因为它对 C++ STL 代码的处理能力大大增强,而且 GCC 4.8 中的优化器使我的代码运行时间缩短为 Centos 附带的 GCC 4.4.7 编译器的一半。
关于如何做到这一点有什么建议吗?
答案1
在您的 Centos 上构建 gcc 编译器,并且仅针对 64 位。
摘自文档:
C 标准库和头文件 为了构建 GCC,C 标准库和头文件必须存在于将为其构建目标库的所有目标变体中(而不仅仅是主机 C++ 编译器的变体)。这会影响流行的“x86_64-unknown-linux-gnu”平台(以及其他多库目标),其中 64 位(“x86_64”)和 32 位(“i386”)libc 头文件通常单独打包。如果您在“x86_64-unknown-linux-gnu”上构建本机编译器,请确保您已正确安装 32 位 libc 开发人员包(包的确切名称取决于您的发行版)或者您必须通过使用选项 --disable-multilib 配置将 GCC 构建为仅限 64 位的编译器。否则,您可能会遇到诸如“致命错误:gnu/stubs-32.h:没有此文件”之类的错误
答案2
啊,欢迎来到超级过时的库的乐趣。我遇到过类似的问题,我们的解决方案是编译第二个版本的 GLIBC 并在启动软件时明确使用它。
我只需要在 CentOS 5 上执行此操作,因此您可能能够使用比我提到的更高的软件版本。
您需要像这样构建 GLIBC:
CFLAGS='-march=i686 -O2' ../configure --prefix=/home/glibc215 \
make -j 4 && make install
(我使用的是 GLIBC 2.15,类似的命令应该适用于较新的版本)
一旦构建完成,请使用以下命令手动运行您的应用程序:
/home/glibc215/lib/ld-linux.so.2 --library-path /home/glibc215/lib/:. /bin/bash
由于您需要 GCC 的现代版本,事情将变得更加复杂。我没有合适的解决方案,您需要尝试使用替代版本的 glibc 来运行程序,以便正确构建较新的 gcc。
答案3
您可以安装较新的 glibc,~/lib
然后安装 gcc~/bin
并链接到较新的 glibc。我建议只将其用于在超级计算机上运行的应用程序,并静态链接所有内容(包括 libc),以避免造成比您为此必须做的更大的混乱。
这不是一个特别简洁/优雅的解决方案,但它可能能完成工作。几年前,我在摆弄 ld.so 时做过类似的事情,因为不想弄乱整个系统 :-)