代码之家  ›  专栏  ›  技术社区  ›  Robert Gould

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

  •  12
  • Robert Gould  · 技术社区  · 16 年前

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

    谢谢

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

    5 回复  |  直到 16 年前
        1
  •  11
  •   qrdl    16 年前

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

    看见 man dlsym 有关详细信息和示例。

    这是一个好消息 article 关于加载动态库,插件基础设施就是一个例子。

    here .

        2
  •  5
  •   Benoît photo_tom    16 年前

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

    link to its documentation

        3
  •  4
  •   Community CDub    5 年前

    libltdl 也许会有帮助。

    Libtool提供了一个称为 libltdl ,旨在向程序员隐藏打开库的各种困难。它由一些头文件和小的C源文件组成,这些文件可以与需要DLOpen功能的应用程序一起分发。在某些平台上,其动态链接器太有限,无法简单实现 服务,它需要GNUDLD,否则它将只模拟使用libtool的dlpreopening机制的动态链接。

    • dlopen (Solaris、Linux和各种BSD风格)
    • shl_load (HP-UX)
    • LoadLibrary
    • load_add_on (贝奥斯)
    • NSAddImage NSLinkModule (达尔文和MacOSX)
    • libtool的dlpreopen(请参见 Dlpreopening )

    扩展似乎只支持Windows PE dll s、 UNIX ELF共享对象和Mac OS X Mach-O捆绑包。好吧,这对你来说已经足够了。。。

        4
  •  2
  •   fa.    16 年前

    对于C++插件,你可以检查 this article 其中详细介绍了如何通过前面提到的posix调用实现它。

    考虑到我们可以使用这些函数来访问C库中的函数,我们如何使用它们来访问C++库中的类?有几个问题需要克服。一是我们必须能够在图书馆找到我们需要的符号。这比它看起来更棘手,因为C和C++文件中存储的符号之间的差异。

        5
  •  2
  •   Klaim    16 年前

    Boost.Extension 看起来不错(从未使用过,但很快就会尝试)。另一种选择是 POCO SharedLibrary class