我正在尝试在目前安装和使用gcc 4.3的系统上安装gcc 4.8.我做了一些研究,并且知道可以保留多个版本的gcc.对我来说,使用--program-suffix =选项对我来说是最好的解决方案.但我的问题是,我可以直接在安装旧gcc的地方安装新的gcc 4.8吗?两个版本的库可以混合在同一个lib目录中吗?
更多细节:旧的gcc安装在/ usr/bin,/ usr/lib64中.如果我将新gcc直接安装到同一位置,新的库也将安装/ usr/lib64.这是一个问题吗?gcc编译器知道链接时要使用哪个库吗?
提前谢谢了!
我使用的是Gentoo,它确实支持同时安装多个版本的GCC。库最终位于/usr/lib/gcc/<target>/<version>. Ubuntu似乎将它们安装在同一个地方,所以我猜这是一个相当常见的设置。
虽然 gcc 显然可以在编译时找出要链接的正确版本,但运行时使用的版本是使用/etc/ld.so.conf.d. 因此,可能会发生这样的情况:程序针对一个版本的 gcc 库进行编译,但使用另一版本执行。
如果ld.so.conf.d设置更喜欢较新的版本而不是较旧的版本,那么只要 gcc 人员没有在这些库之一中引入新的错误,并且只要配置使这些库完全向后兼容,这基本上就可以了。
在此错误中,我们遇到了一种情况,libstdc++破坏了某些 C++11 功能的向后兼容性,这些功能是实验性的,并使用自定义configure开关启用。这些事情应该很少见,但也有可能发生。
在一份相关的 gcc bug 报告中,我从 Jonathan Wakely 那里了解到:
对于任何 x!=y,完全不支持(并且不太可能工作)混合使用 GCC 4.x 和 4.y 构建的 C++11 代码
混合使用 4.8.x 和 4.8.y 构建的代码应该可以工作,并且可以使用默认配置。
因此,虽然这个设置在 Gentoo 上实际可行,但如果您自己尝试的话,您就得靠自己了。特别是因为我知道没有干净的方法来确保生成的二进制文件在运行时链接到匹配的库。
您可以尝试是否--program-suffix也影响库名称。如果是这样,那么SONAME新版本库的 应该与旧版本库的不同,有助于在运行时正确链接。如果库名称不受影响,您可以尝试检查构建系统是否可以更改SONAME生成的库的名称,或者让链接器设置RPATH它链接的所有程序的名称。我对这两种方法都没有经验。
在 Gentoo 上,/usr/bin/gcc似乎是某种包装器,而实际的程序最终是这样/usr/<target>/gcc-bin/<version>/gcc的。至少从软件包网站来看,Ubuntu 对于默认版本的 gcc 并没有这样做,尽管类似的东西显然用于与 Android 的交叉编译。--bindir我猜想该设置是配置时匹配的结果。