跨平台 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++ 动态库插件加载器的主要内容,如果未能解决你的问题,请参考以下文章

C#总结动态加载C++动态链接库

插件之dlopen/dlsym/dlclose 加载动态链接库

C++学习(三四二)静态库 动态库

Linux C++ libdl.so dlfcn.h使用方法(dlopen()dlsym()dlclose()dlerror())(用于动态链接库操作)(懒加载立即加载)共享库符号动态库

采用dlopendlsymdlclose加载动态链接库

采用dlopendlsymdlclose加载动态链接库总结