作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 Windows 中,动态加载器总是首先在加载的可执行文件的路径中查找模块,这使得在不影响系统库的情况下拥有私有(private)库成为可能。
Linux 上的动态加载器仅在固定路径中查找库,因为它独立于所选的二进制文件。我需要 GCC 5 的溢出检查算术函数,但由于 C++ ABI 在 4.9 和 5 之间发生变化,一些应用程序变得不稳定,重新编译它们解决了这个问题。在等待我的发行版 [kubuntu] 升级默认编译器时,是否可以让新编译的应用程序链接到新的运行时,而打包的应用程序仍然通过静态链接或模仿 Windows 行为的方式链接到旧库?
模拟它的一种方法是创建一个包装器脚本
#!/bin/bash
LD_LIBRARY_PATH=$(dirname $(which your_file)) your_file
在链接步骤之后复制受影响的库,但这有点像 hack。
最佳答案
您可以使用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
中查找,然后再搜索系统库路径。
您可以通过指定 -Wl,-rpath, 来模拟 Windows 在可执行文件目录中查找的行为。
[edit] 在 rpath
之前添加了缺少的 -L
参数和破折号。
关于linux - 在 linux 上使用私有(private) C++ 运行时库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826565/
我是一名优秀的程序员,十分优秀!