有人可以阐明将插件加载到 C++ Linux 程序中的最佳实践是什么?
假设我们有一个带有插件(libsyntax.so)的程序(编辑器)。编辑器的配置文件包含 libsyntax.so 库的路径 (plugin1=/opt/editor/gizmos/libsyntax.so)。编辑器读取配置然后调用:
void* library = dlopen(path, RTLD_NOW|RTLD_GLOBAL);
MYFUN* function = (MYFUN*)dlsym(library, "function");
一切都很好,东西工作。
现在让我们假设 (libsyntax.so) 依赖于辅助库 (libcolor.so)。当我们运行 readelf 时,我们得到:
readelf -d libsyntax.so
Dynamic section at offset 0x12b6b48 contains 31 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libcolor.so]
...
但是此时上述 dlopen() 失败并且错误是“没有这样的文件或目录”。使用 LD_DEBUG=all 显示在加载 libsyntax.so 后,消息是:
28664: file=libcolor.so [0]; needed by /home/.../libsyntax.so [0]
28664: find library=libcolor.so [0]; searching
28664: search cache=/etc/ld.so.cache
28664: search path=/lib64/tls/x86_64:/lib64/tls:...:/usr/lib64 (system search path)
28664: trying file=/lib64/tls/x86_64/libcolor.so
... and so on
加载器/链接器正在标准位置查找,显然没有找到我的依赖项。这可以通过 ldconfig 或 LD_LIBRARY_PATH 轻松解决,但两种解决方案都感觉很脏。
有没有一种干净的方式来加载插件和依赖项?你是怎么做到的?