dlopen()与库之间的依赖关系

时间:2012-03-22 00:20:50

标签: macos shared-libraries dlopen

我的程序使用插件,使用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

我该如何做到这一点?

1 个答案:

答案 0 :(得分: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,否则将不会调用它。