C ++继承和动态库加载

时间:2014-03-24 20:53:16

标签: c++ inheritance dynamic-linking

我试图用C ++创建模块化应用程序。静态链接时一切正常,但我想实现插件架构(使用dlopen或LoadLibrary)。

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

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

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

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

3 个答案:

答案 0 :(得分:1)

更好的方法是将基类放在核心库中,该库可由应用程序和模块使用。但请注意,dlopenLoadLibrary都只能加载函数,因此您可能需要在插件库中创建一个能够创建所需对象的函数。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您确实想使用dlopen实现插件体系结构,请查看此答案C++ Dynamic Shared Library on Linux