我试图创建C ++模块化应用。静态链接时一切正常,但我想实现插件架构(使用dlopen或调用LoadLibrary)。
所有基类位于主机应用程序和这些类中的插件模块扩展。模块在运行时加载。
Application Module
---------------- -------------------
| BaseClass1 | | ExtendedClass1 |
| BaseClass2 | | ExtendedClass2 |
| BaseClass3 | | ExtendedClass3 |
---------------- -------------------
但是,当我尝试编译模块,连接器显然无法找到BaseClass的方法引用。
我能以某种方式告诉链接器不将这些类在编译时间链接,让操作系统在运行时负载他们联系呢?或者我应该使用不同的方法和移动基类的一些核心库和两个应用程序和模块这个核心库链接?
就像你说的,使用核心的做法。创建一个公共/ core目录,里面有BaseClass1的所有头文件BaseClass3。当您编译主机应用程序,它可以访问此公共目录。当您编译插件,它也将有机会获得此公共目录。 如果你需要释放主机二元向外部客户,你也将包括通用目录,使外部客户可以编写自己的插件。这是我们的做法。没有最好的解决方案,但它的工作原理。
造成这种情况的更好的方法是具有在核心库其中两个由应用程序和模块是可用的基类。但是,请注意,dlopen
and LoadLibrary
既可以只加载功能,所以你可能会需要有一个功能,这将创造你想要的对象你的插件库。
如果你想实现一个插件架构,与dlopen
,看看这个答案C++ Dynamic Shared Library on Linux。