【发布时间】:2012-04-06 13:44:43
【问题描述】:
我的程序使用插件,这些插件是通过 dlopen() 动态加载的。这些插件的位置可以是任意的,因此它们不一定在库路径中。在某些情况下,一个插件需要依赖另一个插件。因此,如果 A 和 B 是动态库,我将首先加载 A,然后加载使用 A 中定义的符号的 B。
我对 dlopen() 文档的阅读表明,如果我指定 RTLD_GLOBAL,这一切都应该有效。但事实并非如此。当我在第二个库上调用 dlopen() 时,它失败并显示一个错误,说它找不到第一个库(已经用 dlopen() 加载):
Error loading library /usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib: dlopen(/usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib, 9): Library not loaded: libOpenMMOpenCL.dylib
Referenced from: /usr/local/openmm/lib/plugins/libOpenMMRPMDOpenCL.dylib
Reason: image not found
我怎样才能做到这一点?
【问题讨论】:
-
两个库上的
ldd输出是什么样的? -
你有没有用
-rdynamic链接主程序和各个共享库? -
我认为 -rdynamic 正在被指定,但我不确定 - 我正在使用 CMake 构建,它有自己的一组用于构建库的选项。无论如何,我认为这不是问题所在。该错误不会抱怨缺少符号,而是抱怨无法找到库。是的,ldd(或 Mac 上的 otool)将该库报告为依赖项。也许这就是问题所在。有没有办法让插件不特别需要那个库,但仍然使用其中定义的符号?
-
至少在 Linux 上,您可以通过将其链接到另一个共享库来构建共享库...
ldd /usr/lib/libgtksourceviewmm-3.0.so提供 58 个依赖项(即由libgtksourceviewmm-3.0.so链接的其他共享库)。
标签: macos shared-libraries dlopen