【发布时间】:2017-07-22 17:26:48
【问题描述】:
我有一个项目,在这个假设的示例中称为 Super,其中包含一组 .so 文件,这些文件内置在 /home/whatever/super/ 中。在运行时,规范配置文件告诉 Super 使用它们的 .so 名称加载哪些插件。这是在 Ubuntu 16.04 上。
示例插件:
/home/whatever/super/magic.so/home/whatever/super/wow.so/home/whatever/super/awesome.so
我已经设置LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=/home/whatever/super
在 Super 中,我使用 dlopen() 加载模块:
std::string filename = "magic.so"
dlopen(filename.c_str(), RTLD_LAZY)
此时,一切正常。现在我正在尝试打包我的项目,这意味着将内容移动到正确的系统目录。我现在切换到使用/usr/lib/x86_64-linux-gnu/super/ 作为插件的基本路径,如下所示:
/usr/lib/x86_64-linux-gnu/super/magic.so/usr/lib/x86_64-linux-gnu/super/wow.so/usr/lib/x86_64-linux-gnu/super/awesome.so
我还清除了LD_LIBRARY_PATH。我将dlopen() 代码更新为如下所示:
std::string filename = "super/magic.so"
dlopen(filename.c_str(), RTLD_LAZY)
很遗憾,系统不会加载我的模块。我收到此错误:
Cannot load library: super/magic.so: cannot open shared object file: No such file or directory
我确认/etc/ld.so.conf.d/x86_64-linux-gnu.conf 存在并包含:
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
我做错了什么?我已经确认 /usr/lib/x86_64-linux-gnu/super/magic.so 存在。为什么加载程序没有在/usr/lib/x86_64-linux-gnu 的那个子目录中搜索.so 文件?我显然不想将 .so 文件的完整路径硬编码到我的 C++ 代码中。
最后,这是放置插件和加载方法的好方法吗?
【问题讨论】:
标签: c++ plugins shared-libraries ubuntu-16.04 dlopen