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

时间:2009-04-24 11:32:41

标签: c++ c plugins

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

感谢。

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

5 个答案:

答案 0 :(得分:9)

如果您使用的是POSIX,则只需dlopen()dlsym()dlclose()

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

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

EDIT OP将Windows添加为要求,因此这种方法无法帮助,因为Windows不符合POSIX标准。但是,WinAPI中有类似的功能 - 请参阅here

答案 1 :(得分:5)

您可能想尝试Boost.Extension但请注意:尽管名称不同,但它不是升级库之一。

这是link to its documentation

答案 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)
  •   
  • NSAddImageNSLinkModule(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