在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
在链接步骤之后复制受影响的库但它有点像黑客。
答案 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
,然后再搜索系统库路径。
您可以通过指定-Wl,-rpath,.
[edit]在-L
之前添加了缺失的rpath
参数和破折号。