我试图用C ++创建模块化应用程序。静态链接时一切正常,但我想实现插件架构(使用dlopen或LoadLibrary)。
所有基类都位于主机应用程序中,这些类在插件模块中进行了扩展。模块在运行时加载。
Application Module
---------------- -------------------
| BaseClass1 | | ExtendedClass1 |
| BaseClass2 | | ExtendedClass2 |
| BaseClass3 | | ExtendedClass3 |
---------------- -------------------
但是当我尝试编译模块时,链接器显然无法找到对BaseClass方法的引用。
我能以某种方式告诉链接器在编译时不要链接这些类,并让操作系统在运行时加载它们吗? 或者我应该使用不同的方法并将BaseClasses移动到某个核心库并将应用程序和模块链接到此核心库?
答案 0 :(得分:1)
更好的方法是将基类放在核心库中,该库可由应用程序和模块使用。但请注意,dlopen
和LoadLibrary
都只能加载函数,因此您可能需要在插件库中创建一个能够创建所需对象的函数。
答案 1 :(得分:1)
就像你说的那样,使用核心方法。创建一个公共/核心目录,其中包含BaseClass1到BaseClass3的所有头文件。编译主机应用程序时,它将可以访问此公共目录。编译插件时,它也可以访问此公共目录。
如果您需要向外部客户发布主机二进制文件,您还将包含公共目录,以便外部客户可以编写自己的插件。
这是我们的做法。不是最好的解决方案,但它确实有效。
答案 2 :(得分:0)
如果您确实想使用dlopen
实现插件体系结构,请查看此答案C++ Dynamic Shared Library on Linux。