我搜索了这个特定的问题,但无法提出任何结果,无论是在这里还是在线一般(也许是因为对我而言有点难度)。如果已经被问到,请指出我正确的方向。
我希望我的图书馆/软件能够插拔。我看到所有这些插件被广泛使用的各种库和系统,并且作者夸耀地指出(以一种好的方式!)他们的软件具有插件支持。
所以我的问题是,我从哪里开始?是否有任何书籍/在线资源可以打破僵局,可以指导一个人做什么,而不是让你的图书馆可插拔,定义最佳实践等等。
答案 0 :(得分:1)
在开始之前你必须先了解一些事情:
因此,您必须使用共享库(无论文件扩展名是什么,它是关于此主题的搜索的关键字)作为插件二进制文件。如果您的插件应包含多个运行时代码(如图形资源),则可以将图形资源包含在二进制文件中,或者使用包含二进制文件的文件格式或压缩archibe。
无论您设置插件文件的方式如何,在C ++中问题都与界面有关。 根据您使用的编译器,您将有不同的方法将函数或类“标记”为导出/导入(意味着您的插件源代码导出代码,插件的用户应导入代码)。
在C ++中为模块设置干净清晰的界面,没有模板(因为它们依赖于编译器和编译器配置)。这些接口应该是函数声明和类声明,没有内联代码并标记为导出/导入。
现在,一旦你有了这个,你可以使用特定于操作系统的API在应用程序运行时加载/卸载动态库二进制文件。完成后,您可以再次使用特定于操作系统的API获取指向函数的指针。我让你搜索它。
现在,有些库提供了以跨平台方式抽象的方法。我还没有使用它们,并且由于C ++标准中缺乏定义,它们被认为是不完美的,但是如果你计划让你的应用程序跨平台,它们会很有用:
如果您不需要支持大量目标平台,那么很容易设置的另一种选择是围绕特定于操作系统的API编写一些包装代码。这就是我在了解boost :: extension之前所做的事情。