我的程序使用插件,使用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
我该如何做到这一点?
答案 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,否则将不会调用它。