链接共享库,无需自定义LD_LIBRARY_PATH调用程序

5

我可以成功地链接到 libawesomium-1.6.5.so

-L-L.
-L-lawesomium-1.6.5
-L-ldl

libawesomium-1.6.5.so与我的可执行文件在同一个目录下。如果我试图调用我的程序(现在先称之为prog),它将以以下方式退出:

./prog: error while loading shared libraries: libawesomium-1.6.5.so.0: cannot open shared object file: No such file or directory

所以我创建了一个符号链接 libawesomium-1.6.5.so.0,指向 libawesomium-1.6.5.so,再次运行 prog 仍然报同样的错误。使用自定义的 LD_LIBRARY_PATH=./ 参数调用可以解决此问题,但是我想要分发 prog 并且希望用户能够在无需root权限和不设置 LD_LIBRARY_PATH 的情况下使用它(将 awesomium 安装到 /usr/lib 等位置)。一种选择是编写脚本来设置 LD_LIBRARY_PATH,但我更喜欢另外一种方式(也听说设置 LD_LIBRARY_PATH 不是一个好主意)。

而且,如果不需要创建指向 libawesomium-1.6.5.so.0 的符号链接就更好了。

编辑:

传递 -rpath=. 参数给链接器可以解决问题!但遗憾的是 awesomium 无法处理它:

/.../awesomium_test/AwesomiumProcess: error while loading shared libraries: libawesomium-1.6.5.so.0: cannot open shared object file: No such file or directory

使用-rpath并从程序内部设置LD_LIBRARY_PATH是有效的。
2个回答

6
如果您使用gcc编译,可以使用-Wl,-rpath=lib_directory参数,使可执行文件在目录lib_directory中搜索库。
此外,该参数接受一个特殊值$ORIGIN,代表包含执行程序的目录。因此,如果您将-Wl,-rpath='$ORIGIN'传递给gcc,就能够将libawesomium-1.6.5.so保存在与程序相同的目录中。

我已经想通了! 我可以在我的程序中加载 awesomium 之前设置 LD_LIBRARY_PATH - dav1d
你应该传递 -Wl,-rpath='$ORIGIN' 而不是 -Wl,-rpath=.,这样 LI_LIBRARY_PATH 将无用。 - Julien
传递-rpath ='$ ORIGIN'不能解决问题:AwesomiumProcess是与awesomium一起提供的不同可执行文件。我认为它用于创建渲染线程。因此,我仍然需要设置LD_LIBRARY_PATH,但这并不是什么大问题。 - dav1d

1
错误是因为点号“.”不在您的路径中。您的选择是分发一个bash脚本,该脚本使用设置了LD_LIBRARY_PATH的二进制文件运行,或者将共享对象复制到/usr/lib或/usr/local/lib或适合该特定平台的任何其他位置。
除非您想进行静态链接,否则真的没有捷径可走。

是的,我想避免这两种方式。感谢您明确指出没有其他方法。静态链接不起作用,因为awesomium没有静态库(闭源,只提供.so)。 - dav1d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接