用古董glibc编译现代GCC的麻烦

我正试图让一个现代的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似乎没有这个function。 我已经尝试构build我自己的glibc但是一旦安装完成,并且在我的本地LD_LIBRARY_PATH我无法运行任何其他程序,因为系统上的所有现有可执行文件都会尝试链接到它并导致失败。

我想使用新的编译器,因为它具有更好的C ++ STL代码处理能力,并且因为GCC 4.8中的优化器使得我的代码在1/2时间内运行,就像CentOS附带的GCC 4.4.7编译器一样。

任何build议如何做到这一点?

在您的CentOS上构buildgcc编译器,并仅以64位为目标。
文件摘录:

C标准库和头文件为了构buildGCC,对于要为其构build目标库的所有目标变体(而不仅仅是主机C ++编译器的变体),C标准库和头文件必须存在。 这会影响到stream行的“x86_64-unknown-linux-gnu”平台(以及其他multilib目标),通常将64位('x86_64')和32位('i386')libc头文件分开打包。 如果你在'x86_64-unknown-linux-gnu'上build立了一个本地编译器,确保你已经正确安装了32位的libc开发包(确切的包名取决于你的发行版),或者你必须构buildGCC作为64位唯一的编译器,通过configuration选项–disable-multilib。 否则,你可能会遇到一个错误,如“致命错误:gnu / stubs-32.h:没有这样的文件”

啊,欢迎来到超级过时的图书馆。 我遇到了类似的问题,我们的解决scheme是编译第二版GLIBC,并在启动软件时明确使用它。

我只需要在CentOS 5上这样做,所以你可能能够逃脱更高的软件版本,然后我提到。

你需要像这样构buildGLIBC:

 CFLAGS='-march=i686 -O2' ../configure --prefix=/home/glibc215 \ make -j 4 && make install 

(我使用的是GLIBC 2.15,类似的命令应该可以使用更新的版本)

一旦build成,手动运行你的应用程序这样的事情:

 /home/glibc215/lib/ld-linux.so.2 --library-path /home/glibc215/lib/:. /bin/bash 

由于您需要现代版本的GCC,事情会变得更加复杂。 我没有一个像样的解决scheme,你需要用glibc的替代版本来运行,以便让你的新gcc能够正确地构build。

你可以在~/lib安装一个新的glibc,并在~/bin安装gcc,然后连接到新的glibc。 我build议只将它用于在超级计算机上运行的应用程序,并且将所有内容(包括libc)静态地链接起来,以免造成比您需要做的更大的混乱。

这不是一个非常整洁/优雅的解决scheme,但它可能只是完成工作。 我几年前做过类似ld.so的工作,而不想搞乱整个系统:-)