【发布时间】:2014-03-17 16:37:44
【问题描述】:
我目前正在寻找在 Linux 上公开共享库位置的方法,以便任何单独安装的程序都可以轻松获取它。我想让这个位置可配置,以便它可以指向同一个库的不同可能安装。我能想到的类似案例有 Qt5 和 Java。
长话短说,我正在开发FreeRDS,这是一个基于FreeRDP 的远程桌面服务堆栈。服务器端 RDS 感知应用程序链接到 libwinpr-wtsapi,这是一个公开 Microsoft Windows 终端服务 API 接口但不实现它的存根库。这使应用程序能够链接到 libwinpr-wtsapi,而无需直接链接到特定的 RDS 实现。在第一次调用任何 WTSAPI 函数时,真正的实现由 libwinpr-wtsapi 动态加载。但是,需要知道实现 WTSAPI(此处为 FreeRDS)的动态库的位置。
现在,我通过设置具有库的完整路径的环境变量来实现这一点:
export WTSAPI_LIBRARY=/opt/freerds/lib/x86_64-linux-gnu/libfreerds-fdsapi.so
但是,这不是很实用,因为需要使用WTSAPI 为每个程序设置此环境变量。在这种情况下,我在 /opt/freerds 中安装了 FreeRDS。
我想我可以通过使用单个环境变量在系统上公开FreeRDS 的安装前缀来简化这一点,类似于 JAVA_HOME:
export FREERDS_HOME=/opt/freerds
但是,我需要知道正确的库子目录。同样重要的是要知道,将来有可能同时提供32-bit 和64-bit 版本的库,提供FreeRDS WTSAPI。这个库基本上使用FreeRDS 会话管理器执行RPC,所以这绝对是可能的。
假设我们正确设置了FREERDS_HOME,或者FreeRDS 安装在系统的默认安装前缀中,哪些文件将是“标准”以提供一些额外的安装配置信息?在这里,我想我可以有一个等效于Qt5 的qt.conf,它将特定的安装子目录,如64-bit 安装子目录、32-bit 安装子目录等。但是,我不知道在哪里我应该把那个文件。应该在<prefix>/etc/freerds/freerds.conf吗?
想法,有人吗?谢谢!
【问题讨论】:
-
为你喜欢的发行版打包它;将其安装在
/usr/lib/libfreerds-fdsapi.so或附近。 -
"... 使此位置可配置,以便它可以指向同一库的不同可能安装。": "different" in条款是什么?发布版本、平台、功能?
-
系统范围的库路径在 /etc/ld.so.conf 中配置,是你需要的吗?
-
您始终可以通过
dlopen()和dlsym()设置函数指针,而不是直接将库链接到您的目标。这将需要您进行一些额外的编码,但是以干净、易于阅读的方式支持库的多个版本变得非常容易。 -
WTSAPI 实现 (libfreerds-fdsapi.so) 已经是一个旨在由 libwinpr-wtsapi.so 动态加载的库。 libfreerds-fdsapi.so 导出单个入口点,该入口点返回指向回调数组的指针。 libwinpr-wtsapi.so 导出具有相同签名的函数,并调用动态加载的回调。这允许程序链接到 libwinpr-wtsapi.so,而无需直接链接到特定的 WTSAPI 实现。
标签: c linux shared-libraries