6

我正在开发一个项目,该项目具有多个相似的代码路径,我想将其从主项目中分离到插件中。该项目必须保持跨平台兼容,并且我研究过的所有动态库加载 API 都是特定于平台的。

创建一个可以在多个操作系统上编译和运行而无需额外修改代码的动态库加载系统的最简单方法是什么?理想情况下,我想写一个插件,让它在项目支持的所有操作系统上工作。

谢谢。

4

4 回答 4

7

您将不得不为加载系统使用平台相关代码。在 Windows 上加载 DLL 与在 Unix 中加载共享对象是不同的。但是,你们中的几个人#ifdef将能够在加载器中拥有几乎相同的代码库。

话虽如此,我认为您可以使您的插件平台独立。当然,您必须为每个平台编译它,但代码将 99% 相同。

于 2010-08-24T21:08:19.597 回答
5

加载 Windows 和 Unix/Linux 的动态库可使用 3 个函数。一对用于加载/卸载库的函数,以及另一个用于获取库中函数地址的函数。您可以轻松地围绕这三个函数编写一个包装器,以提供跨操作系统支持。

于 2010-08-24T21:10:20.453 回答
4

理想情况下,我想写一个插件,让它在项目支持的所有操作系统上工作。

我脑子里想的几件事:

  • 避免动态库中的静态对象。提供适当的初始化方法/函数来分配对象。在操作系统加载库期间发生的问题(这是调用静态对象的 c'tors 时)非常难以调试 - 仅次于多线程问题。

  • 接口标头可能不包含代码。没有内联方法,没有预处理器定义。这是为了避免使用来自特定版本库的代码污染应用程序,使其无法在以后替换库。

  • 接口头可能不包含实现类本身——只有抽象类和工厂函数。与前一点类似——避免应用程序依赖于特定版本的类。工厂需要作为用户应用程序实例化具体实现类的一种方式。

  • 在引入新版本的接口时,为了保持某种方式向后兼容,不要修改现有的抽象类 - 创建从它继承的新抽象类并在那里添加新方法。更改工厂以返回新版本。(回忆 MS 的 IInterface、IInterface2、IInterface3 等。)在实现中,使用较新版本的抽象类。多态性将使实现与旧接口版本向后兼容。(这显然需要定期的界面维护和清理——去除旧的垃圾。)

于 2010-08-24T21:40:21.703 回答
2

看看 boost.extension 库,它并不是 boost 的一部分,但你可以在沙箱中找到它。它也有点冻结,但总体而言,该库稳定且易于使用。

于 2010-08-24T21:39:10.100 回答