一个基于C/C++插件的系统需要哪些好的设计模式?

16

在开发需要支持动态加载的共享对象/动态库的C/C++ (=2?)插件化框架时,有哪些示例可以帮助实现细节呢?

谢谢。

注意:关键点在于支持“热交换”,且无需重新启动系统。


你能详细解释一下操作系统吗? - Van Gale
请参考https://dev59.com/uXRC5IYBdhLWcg3wMd5S 作为起点。 - unwind
必须支持Windows和Unix。 - Robert Gould
5个回答

12
如果你在POSIX平台上,只需要使用dlopen()dlsym()dlclose()三个函数即可。
请参考man dlsym中的详细说明和示例。
有一篇文章介绍了如何加载动态库,插件架构是其中的一个示例。 编辑:问题提出者要求Windows环境下运行,这种方法不再适用,因为Windows不兼容POSIX。不过WinAPI中也有类似的函数,可以在这里查看相关信息。

虽然可能,但我建议使用一个跨平台的库,比如ACE http://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/a00110.html - lothar

5

你可能想要尝试使用 Boost.Extension,但需要注意的是:尽管其名称中含有 Boost,但它并不是 Boost 库之一。

这里是 它的文档链接


非常好,它还不是Boost(但)它在沙盒中。 - Robert Gould

4

对于C++插件,您可以查看本文,其中详细介绍了如何使用先前提到的posix调用来实现它。

引用文章:

考虑到我们可以使用这些函数来访问C库中的函数,那么我们如何使用它们来访问C++库中的类?有几个问题需要克服。其中一个问题是我们必须能够在库中定位所需的符号。由于C和C++文件中存储符号的方式不同,因此这比看起来更加棘手。


4
如果您希望跨平台加载库而无需为每个平台的API单独开发,则libltdl可能会有所帮助。
引用块中提到,“Libtool提供了一个名为libltdl的小型库,旨在将dlopen库的各种困难隐藏起来,使程序员可以使用。它由一些头文件和小的C源代码组成,可以与需要dlopening功能的应用程序一起分发。在某些平台上,其动态链接器过于有限,无法简单地实现libltdl服务,因此需要GNU DLD,否则它只能使用libtool的dlpreopening机制来模拟动态链接。”
Libltdl目前支持以下动态链接机制: - dlopen(Solaris、Linux和各种BSD版本) - shl_load(HP-UX) - LoadLibrary(Win16和Win32) - load_add_on(BeOS) - NSAddImageNSLinkModule(Darwin和Mac OS X) - GNU DLD(模拟静态库的动态链接) - libtool的dlpreopen(请参见Dlpreopening
Boost.Extension似乎只支持Windows PE dll、UNIX ELF共享对象和Mac OS X Mach-O bundles。这对您来说可能已经足够了...

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接