在C ++中编写可移植动态可加载库的最简单方法是什么?

时间:2010-08-24 21:04:42

标签: c++ plugins shared-libraries portability dynamic-loading

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

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

感谢。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

  

理想情况下,我想编写一个插件,让它适用于项目支持的所有操作系统。

我的头脑中很少有东西:

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

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

  • 接口头本身可能不包含实现类 - 只包含抽象类和factory functions。与前一点类似 - 避免应用程序依赖于类的特定版本。工程是用户应用程序实例化具体实现类的一种方式。

  • 在引入新版本的接口时,为了使事物以某种方式向后兼容,不要修改现有的抽象类 - 创建从中继承的新抽象类并在那里添加新方法。更改工厂以返回新版本。 (回想一下MS'IInterface,IInterface2,IInterface3等等。)在实现中,使用更新版本的抽象类。通过多态将使实现向后兼容旧的接口版本。 (这显然要求定期进行接口维护和清理 - 以消除旧的瑕疵。)

答案 3 :(得分:2)

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