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

6
我正在进行一个项目,其中有多个类似的代码路径,我希望将它们从主项目中分离出来成为插件。该项目必须保持跨平台兼容性,而我查看的所有动态库加载API都是特定于平台的。
有什么最简单的方法可以创建一个动态库加载系统,可以在多个操作系统上编译和运行,而不需要对代码进行额外的修改?理想情况下,我希望编写一个插件,并使其在项目支持的所有操作系统上工作。
谢谢。
4个回答

7
你需要使用与平台相关的代码来进行加载系统。在Windows上加载DLL与在Unix上加载共享对象是不同的。但是,通过几个#ifdef,你将能够在加载器中拥有大多数相同的代码基础。
话虽如此,我认为你可以使你的插件具备跨平台性。当然,你需要为每个平台编译它,但代码将会有99%是相同的。

5

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


4

理想情况下,我希望编写一个插件,并使其在项目支持的所有操作系统上工作。

以下是我脑海中的几个问题:

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

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

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

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


2

看一下boost.extension库,它并不是boost的一部分,但你可以在沙盒中找到它。它有点冻结了,但总体上这个库很稳定且易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接