【问题标题】:Preparing a library for plugin support为插件支持准备一个库
【发布时间】:2011-04-18 14:11:52
【问题描述】:

我搜索了这个特定的问题,但找不到任何结果,无论是在这里还是在网上都没有(可能是因为对我来说这有点难以表达)。如果已经问过,请指出正确的方向。

我希望我的库/软件可以插入。我看到所有这些广泛使用插件的各种库和系统,作者自夸地指出(以一种好的方式!)他们的软件支持插件。

所以我的问题是,我从哪里开始?是否有任何书籍/在线资源可以打破僵局,并可以指导人们在使您的图书馆可插拔、定义最佳实践等方面的注意事项?

【问题讨论】:

  • 首先在此站点中搜索您的确切标签,即“[c++] [plugins]”,然后按票数排序。那里的第一个问题将使您起步。投票结束。
  • 几年前 Dobbs 博士也有一篇文章...drdobbs.com/cpp/204202899?pgno=1。这是一篇由 5 部分组成的文章,其他部分的链接位于第一部分的顶部。

标签: c++ plugins


【解决方案1】:

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

  1. 标准 C++ 中不支持模块(静态或动态)。没有。还没有。也许在 2015 年。
  2. Dll(或类 unix 系统上的 .so)是动态加载的库,依赖于编译器/操作系统。因此,这是一个满足需求的务实解决方案。

因此,您必须使用共享库(无论文件扩展名是什么,它都是搜索该主题的关键字)作为插件二进制文件。如果您的插件应该包含的不仅仅是运行时代码,例如图形资源,您可以将图形资源包含在二进制文件中,或者具有包含二进制文件的文件格式或压缩档案。

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

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

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

现在,有一些库提供了以跨平台方式对其进行抽象的方法。我还没有使用它们,并且由于 C++ 标准中缺少定义,它们被认为是不完美的,但如果您打算让您的应用程序跨平台,它们可能会很有用:

  • boost::extension:它还不是一个 boost 库,甚至还没有被提议,它的开发处于暂停状态(直到一些新的标准 C++ 实现完成)所以这可能是一个坏主意,但很多人说他们成功使用它.
  • POCO libraries 有 a library for shared libraries,这相当于 boost::extension。再说一次,很多人说它很有用,所以我想它已经足够好用了。

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

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2012-10-03
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多