C++继承和动态库加载
问题描述:
我想在C++中创建模块化应用程序。静态链接时一切正常,但我想实现插件架构(使用dlopen或LoadLibrary)。C++继承和动态库加载
所有基类都位于主机apllication中,并且这些类在插件模块中进行了扩展。模块在运行时加载。
Application Module
---------------- -------------------
| BaseClass1 | | ExtendedClass1 |
| BaseClass2 | | ExtendedClass2 |
| BaseClass3 | | ExtendedClass3 |
---------------- -------------------
但是当我尝试编译模块时,链接器显然找不到对BaseClass方法的引用。
我可以告诉链接器不要在编译时链接这些类,让操作系统在运行时加载链接它们吗? 或者我应该使用不同的方法并将BaseClass移动到某个核心库,并将应用程序和模块链接到此核心库?
答
就像你说的,使用核心方法。创建一个通用/核心目录,其中包含BaseClass1到BaseClass3的所有头文件。当您编译主机应用程序时,它将有权访问此公共目录。当你编译插件时,它也可以访问这个公共目录。
如果您需要向外部客户发布主机二进制文件,您还将包含公共目录,以便外部客户可以编写自己的插件。 这是我们如何做到的。不是最好的解决方案,但它有效。
答
更好的方法是在应用程序和模块都可以使用的核心库中拥有基类。不过,请注意,dlopen
和LoadLibrary
都只能加载函数,所以可能需要在插件库中有一个函数来创建所需的对象。
是的,我知道这一点。我做了一些实验,并且我正在加载返回指向对象实例的指针的函数。我也认为最好有核心库,因为我以后可以将CLI应用程序更改为GUI,而不需要将类移动到新的类。 – chatoooo