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