基于C / C ++插件的系统的良好模式?

使用需要支持实时交换的共享对象/动态库开发基于C / C ++(= 2?)插件的框架时,哪些示例有助于查看实现细节?

谢谢。

注意:实时交换是这里的关键点,无需重启系统是必需的

如果你在POSIX上,你需要dlopen()dlsym()dlclose()

有关详细信息和示例,请参阅man dlsym

有一篇关于加载动态库的好文章 ,插件基础结构就是一个例子。

EDIT OP添加了Windows作为要求,因此这种方法无济于事,因为Windows不符合POSIX标准。 但是WinAPI中有类似的function – 请参见此处 。

你可能想尝试Boost.Extension但要注意:尽管它的名字,它不是一个boost库。

这是其文档的链接 。

如果您想要跨平台库加载而无需为每个平台的API单独开发, libltdl可能会有所帮助。

Libtool提供了一个名为libltdl的小型库,旨在隐藏程序员对库中的各种困难。 它包含一些标题和小C源文件,可以与需要降低function的应用程序一起分发。 在某些平台上,其动态链接器对于libltdl服务的简单实现而言太有限,它需要GNU DLD,或者它只能模拟与libtool的dlpreprening机制的动态链接。

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(参见Dlpreprening )

Boost.Extension似乎只支持Windows PE dll ,UNIX ELF共享对象和Mac OS X Mach-O软件包。 嗯,这对你来说可能就足够了……

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

引用文章:

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

Boost.Extension似乎很好(从未使用它,但很快就会尝试)。 另一种选择是POCO SharedLibrary类 。