2009-04-24 63 views
11

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

谢谢。

注:现场交换是这里的关键点,不需要重新启动系统是一个要求

+0

你可以详细说明操作系统吗? – 2009-04-24 11:39:56

+0

请参阅http://stackoverflow.com/questions/384121/creating-a-module-system-dynamic-loading-in-c作为起点。 – unwind 2009-04-24 11:46:40

+0

对于Windows /其他操作系统? – RobS 2009-04-24 12:11:46

回答

9

如果你是在POSIX,dlopen()dlsym()dlclose()都是你所需要的。

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

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

编辑 OP添加Windows作为规定,使这种做法将无助,因为Windows不是符合POSIX标准。但是在WinAPI中有类似的功能 - 请参阅here

2

对于C++插件,你可以检查this article哪些细节如何实现它与先前提到的posix调用。

引用的文章:

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

4

如果您希望跨平台的库加载而不必为每个平台的API单独开发,libltdl可能会有所帮助。

Libtool提供了一个小型库,名为libltdl,旨在隐藏程序员钻取图书馆的各种困难。它由几个头文件和小型C源文件组成,这些文件可以与需要钻取功能的应用程序一起分发。在某些平台上,其动态链接器对于简单实现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 S,UNIX ELF共享对象和Mac OS X Mach-O软件包。那么,这可能已经足够...