在linux上使用私有C ++运行时库

时间:2015-08-05 07:55:15

标签: linux gcc dynamic-linking libstdc++

在Windows中,动态加载程序始终首先在加载的可执行文件的路径中查找模块,从而可以在不影响系统库的情况下拥有私有库。

Linux上的动态加载程序只在固定路径中查找库,因为它独立于所选的二进制文件。我需要GCC 5作为其溢出检查算术函数,但由于C ++ ABI在4.9和5之间变化,一些应用程序变得不稳定并重新编译它们解决了这个问题。在等待我的发行版[kubuntu]升级默认编译器时,是否可以将新编译的应用程序链接到新的运行时,而打包的应用程序仍然链接到旧库,通过静态链接或模仿Windows行为的东西?

模仿它的一种方法是创建一个包装脚本

SELECT DISTINCT CASE WHEN FLAG=1 THEN FILENAME + '_part_1' 
ELSE FILENAME END
FROM FILENAMES

在链接步骤之后复制受影响的库但它有点像黑客。

1 个答案:

答案 0 :(得分:3)

您可以使用rpath

让我们说你的新ABI"共享库位于/usr/local/newapi-libs

gcc -L/usr/local/newapi-libs
    -Wl,-rpath,/usr/local/newapi-libs
    program.cpp -o program -lsomething`

链接器的-rpath选项是-L的运行时对应选项。当运行以这种方式编译的程序时,链接器将首先查找/usr/local/newapi-libs,然后再搜索系统库路径。

更多信息herehere

您可以通过指定-Wl,-rpath,.

来模拟查看可执行文件目录的Windows行为

[edit]在-L之前添加了缺失的rpath参数和破折号。