C++继承和动态库加载

C++继承和动态库加载

问题描述:

我想在C++中创建模块化应用程序。静态链接时一切正常,但我想实现插件架构(使用dlopen或LoadLibrary)。C++继承和动态库加载

所有基类都位于主机apllication中,并且这些类在插件模块中进行了扩展。模块在运行时加载。

Application    Module 
----------------   ------------------- 
| BaseClass1 |   | ExtendedClass1 | 
| BaseClass2 |   | ExtendedClass2 | 
| BaseClass3 |   | ExtendedClass3 | 
----------------   ------------------- 

但是当我尝试编译模块时,链接器显然找不到对BaseClass方法的引用。

我可以告诉链接器不要在编译时链接这些类,让操作系统在运行时加载链接它们吗? 或者我应该使用不同的方法并将BaseClass移动到某个核心库,并将应用程序和模块链接到此核心库?

就像你说的,使用核心方法。创建一个通用/核心目录,其中包含BaseClass1到BaseClass3的所有头文件。当您编译主机应用程序时,它将有权访问此公共目录。当你编译插件时,它也可以访问这个公共目录。
如果您需要向外部客户发布主机二进制文件,您还将包含公共目录,以便外部客户可以编写自己的插件。 这是我们如何做到的。不是最好的解决方案,但它有效。

更好的方法是在应用程序和模块都可以使用的核心库中拥有基类。不过,请注意,dlopenLoadLibrary都只能加载函数,所以可能需要在插件库中有一个函数来创建所需的对象。

+0

是的,我知道这一点。我做了一些实验,并且我正在加载返回指向对象实例的指针的函数。我也认为最好有核心库,因为我以后可以将CLI应用程序更改为GUI,而不需要将类移动到新的类。 – chatoooo