Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;继承与动态库加载 我试图在C++中创建模块化应用程序。静态链接时,一切都可以正常工作,但我希望实现插件体系结构(使用dlopen或LoadLibrary)_C++_Inheritance_Dynamic Linking - Fatal编程技术网

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,而无需将类移动到新类。