跨平台 C++ 动态库插件加载器
Posted
技术标签:
【中文标题】跨平台 C++ 动态库插件加载器【英文标题】:Cross-Platform C++ Dynamic Library Plugin Loader 【发布时间】:2010-10-19 22:04:30 【问题描述】:我只是想知道对于使用共享库动态加载插件的跨平台实现,我有哪些选择。到目前为止,我发现的唯一一个是:
http://library.gnome.org/devel/glib/stable/glib-Dynamic-Loading-of-Modules.html我只是想知道我是否还有其他选择?本质上,我希望能够将插件放入共享对象文件中,并在运行时加载它们,我希望以跨平台的 C++ 方式来实现。
编辑:我在 2007 年发现了这个 Dr Dobbs Post;从那以后肯定有人想出了更多的东西。
【问题讨论】:
***.com/questions/43322/…的可能重复 【参考方案1】:您可以查看Boost Extension,,尽管它尚未被 Boost 接受。
Boost.Extension 库已经 开发以缓解开发 插件和类似的扩展 使用共享库的软件。 类、函数和数据可以是 从共享库提供 并由应用程序加载。
【讨论】:
不错。我喜欢 Boost 库,我会看看它与 boost 本身的分离有多近。 不要这样做。原作者已弃用他自己的作品。 blog.redshoelace.com/2014/01/c0x.html#links 自2016年起,Boost v1.61.0增加了dll。 Reference。 Documentation 1.73.0【参考方案2】:Qt 有一个不错的plugin system。你应该看看那个页面的second part。
【讨论】:
Qt 会知道他们在做什么,我应该想到他们,现在阅读。谢谢。【参考方案3】:如果您想要简单轻量级的东西,请尝试:https://pocoproject.org/docs/package-Foundation.SharedLibrary.html
使用 SharedLibrary 类,调用 C 共享库中的函数需要三行代码:
Poco::SharedLibrary lib("libfoo.so");
int (* foo)(int) = reinterpret_cast<int (*)(int)>(lib.getSymbol("foo"));
printf("answer %d\n", foo(5));
【讨论】:
以上是关于跨平台 C++ 动态库插件加载器的主要内容,如果未能解决你的问题,请参考以下文章
插件之dlopen/dlsym/dlclose 加载动态链接库
Linux C++ libdl.so dlfcn.h使用方法(dlopen()dlsym()dlclose()dlerror())(用于动态链接库操作)(懒加载立即加载)共享库符号动态库