准备库以获得插件支持

时间:2011-04-18 14:11:53

标签: c++ plugins

我搜索了这个特定的问题,但无法提出任何结果,无论是在这里还是在线一般(也许是因为对我而言有点难度)。如果已经被问到,请指出我正确的方向。

我希望我的图书馆/软件能够插拔。我看到所有这些插件被广泛使用的各种库和系统,并且作者夸耀地指出(以一种好的方式!)他们的软件具有插件支持。

所以我的问题是,我从哪里开始?是否有任何书籍/在线资源可以打破僵局,可以指导一个人做什么,而不是让你的图书馆可插拔,定义最佳实践等等。

1 个答案:

答案 0 :(得分:1)

在开始之前你必须先了解一些事情:

  1. 标准C ++中不支持模块(静态或动态)。不。还没。也许在2015年。
  2. Dlls(或类似unix的系统上的.so)是动态加载的库,它们依赖于编译器/操作系统。因此,这是一个满足需求的实用解决方案。
  3. 因此,您必须使用共享库(无论文件扩展名是什么,它是关于此主题的搜索的关键字)作为插件二进制文件。如果您的插件应包含多个运行时代码(如图形资源),则可以将图形资源包含在二进制文件中,或者使用包含二进制文件的文件格式或压缩archibe。

    无论您设置插件文件的方式如何,在C ++中问题都与界面有关。 根据您使用的编译器,您将有不同的方法将函数或类“标记”为导出/导入(意味着您的插件源代码导出代码,插件的用户应导入代码)。

    在C ++中为模块设置干净清晰的界面,没有模板(因为它们依赖于编译器和编译器配置)。这些接口应该是函数声明和类声明,没有内联代码并标记为导出/导入。

    现在,一旦你有了这个,你可以使用特定于操作系统的API在应用程序运行时加载/卸载动态库二进制文件。完成后,您可以再次使用特定于操作系统的API获取指向函数的指针。我让你搜索它。

    现在,有些库提供了以跨平台方式抽象的方法。我还没有使用它们,并且由于C ++标准中缺乏定义,它们被认为是不完美的,但是如果你计划让你的应用程序跨平台,它们会很有用:

    • boost::extension:它还不是一个提升库,甚至还没有提出,它的开发暂停(直到一些新的标准C ++实现完成)所以它可能是一个坏主意,但很多人说他们成功地使用它。
    • POCO librariea library for shared libraries,相当于boost :: extension。很多人都说这很有用,所以我觉得它很好用。

    如果您不需要支持大量目标平台,那么很容易设置的另一种选择是围绕特定于操作系统的API编写一些包装代码。这就是我在了解boost :: extension之前所做的事情。