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

Use private C++ runtime library on linux

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

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

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

#!/bin/bash
LD_LIBRARY_PATH=$(dirname $(which your_file)) your_file

并在链接步骤后复制受影响的库,但这有点麻烦。

您可以使用 rpath.

假设您的 "new ABI" 共享库位于 /usr/local/newapi-libs.

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

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

更多信息here and here

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

来模拟 Windows 在可执行文件目录中查找的行为

[edit] 在 rpath.

之前添加了缺少的 -L 参数和破折号