【问题标题】:dlopen() with dependencies between librariesdlopen() 与库之间的依赖关系
【发布时间】: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


【解决方案1】:

在此处查看此答案: dlopen() error image not found

如果您将库修改为具有@rpath/blah.dylib 的安装名称,您将能够执行此操作。

编辑:

我也在用cmake,用这个:

set_target_properties(${MY_LIB} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")

这也不会破坏其他平台上的东西,但请确保您没有调用 CMAKE_SKIP_RPATH 否则它不会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多