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