gpt4 book ai didi

c++ - 为插件支持准备一个库

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:14 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

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

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

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

关于c++ - 为插件支持准备一个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com