使用可执行文件分发共享对象(最佳实践?)

时间:2013-12-20 22:49:26

标签: c++ c linux shared-libraries ld

我需要在我的应用程序中分发一个版本的OpenSSL。我不能使用Ubuntu,因为发行版当前禁用了TLSv1.1和TLSv1.2。

我已经阅读了一些关于如何解决丢失的共享对象的帖子(例如,How to add shared library search path to a executable file?)。

我担心的是我有一个与disto名称相同的库,它的二进制文件与发行版兼容。

我的问题是,是否有最佳实践来分发预期会发生冲突的共享对象?

2 个答案:

答案 0 :(得分:2)

将SO放在私有目录中,并在运行可执行文件之前将该目录添加到包装器脚本中的$LD_LIBRARY_PATH环境变量中。

答案 1 :(得分:1)

与在包装器脚本中设置LD_LIBRARY_PATH环境变量相反,您还可以使用额外的链接器标志编译可执行文件,这些标记会添加目录以搜索共享库。

链接器标志为-Wl,-rpath,<path to lib directory>

例如,假设您要将应用安装到/opt/myapp/bin,您还可以拥有一个文件夹/opt/myapp/lib,并在该文件夹中放置libssl.so。然后,您将使用额外的链接器标志-Wl,-rpath,/opt/myapp/lib编译您的应用程序。然后,当您运行应用程序时,它将首先查找该文件夹,然后再搜索标准文件夹以查找共享库。