在 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
中查找,然后再搜索系统库路径。
您可以通过指定 -Wl,-rpath,.
来模拟 Windows 在可执行文件目录中查找的行为
[edit] 在 rpath
.
之前添加了缺少的 -L
参数和破折号
在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
中查找,然后再搜索系统库路径。
您可以通过指定 -Wl,-rpath,.
[edit] 在 rpath
.
-L
参数和破折号