在使用需要支持实时交换的共享对象/动态库开发基于C / C ++(= 2?)插件的框架时,哪些示例有助于查看实现细节?
感谢。
注意:实时交换是这里的关键点,无需重启系统是一项要求
答案 0 :(得分:9)
如果您使用的是POSIX,则只需dlopen()
,dlsym()
和dlclose()
。
有关详细信息和示例,请参阅man dlsym
。
关于加载动态库有一个很好的article,插件基础结构就是一个例子。
EDIT OP将Windows添加为要求,因此这种方法无法帮助,因为Windows不符合POSIX标准。但是,WinAPI中有类似的功能 - 请参阅here。
答案 1 :(得分:5)
您可能想尝试Boost.Extension但请注意:尽管名称不同,但它不是升级库之一。
答案 2 :(得分:4)
如果您希望跨平台库加载而无需单独为每个平台的API进行开发,libltdl可能有所帮助。
Libtool提供了一个名为
libltdl
的小型库,旨在隐藏程序员对库中的各种困难。它由一些标题和小C源文件组成,可以与需要降低功能的应用程序一起分发。在某些平台上,其动态链接器对于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(参见Dlpreopening)
Boost.Extension似乎只支持Windows PE dll
,UNIX ELF共享对象和Mac OS X Mach-O软件包。嗯,这对你来说已经足够......
答案 3 :(得分:2)
对于C ++插件,您可以查看this article,详细说明如何通过前面提到的posix调用实现它。
引用文章:
鉴于我们可以使用这些函数来访问C库中的函数,我们如何使用它们来访问C ++库中的类?有几个问题需要克服。一个是我们必须能够在库中找到我们需要的符号。由于符号存储在C和C ++文件中的方式不同,这比看起来更棘手。
答案 4 :(得分:2)
Boost.Extension似乎很好(从未使用它,但很快就会尝试)。另一种选择是POCO SharedLibrary class。