基于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)NSAddImage
或NSLinkModule
(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类 。