2011-04-18 32 views
2

我搜索了这个特定的问题,但不能得出任何结果,既不在这里也不在线上(可能是因为它对我来说有点困难)。如果它已经被问到,请指出正确的方向。为插件支持准备一个库

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

所以我的问题是,我从哪里开始?是否有任何书籍/在线资源可以打破僵局,并且可以指导一个关于do的方法,而不要让你的库可插入,定义最佳实践等等?

+0

首先在本网站上搜索您的确切标签,即“[C++] [plugins]”和按票数排序。那里的第一个问题会让你失望。投票结束。 – Mat 2011-04-18 14:19:10

+0

几年前,Dobbs博士还有一篇文章,这篇文章的内容是:http://drdobbs.com/cpp/204202899?pgno = 1。这是一篇包含5部分的文章,其他部分的链接位于第一部分的顶部。 – dgnorton 2011-04-18 14:44:18

回答

1

你开始之前,了解一些事情:

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

所以,你将不得不使用共享库(无论文件扩展名,它是关于这个主题的搜索关键字)作为插件二进制文件。如果您的插件应包含多个运行时代码(如图形资源),则可以将图形资源包含在二进制文件中,或者使用包含二进制文件的文件格式或压缩archibe。

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

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

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

现在,有些库提供了以跨平台的方式来抽象它的方法。我并没有使用它们,它们是已知的,因为缺乏在C++标准定义是不完美的,但如果你打算让应用程序跨平台的,他们可能是有用的:

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

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