热插拔C++库可能吗?

Nek*_*ios 10 c++ cross-platform shared-libraries dynamic-linking

我正在寻找"热插拔"C++代码库.我有兴趣让这项技术在Linux/Mac/Windows之间跨平台工作.基本上我想要主程序#include"StateMachine.h"来定义所有可调用接口.然后在运行时和DURING EXECUTION加载和卸载StateMachineLibrary.a以使我的应用程序使用不同的状态机.

我有一个想法可能是做一些事情,比如写一个包装器,将这个编译的代码加载到我自己的malloc内存中,并在该内存中创建函数指针?

动机是我的项目的状态机部分将经常更改并需要重新编译,也允许主应用程序继续运行,同时加载不同的状态机.我希望使用一个"热插拔"库来安装像Lua脚本这样的东西,因为有些担心,所以考虑到作为一种替代品已经被探索过了.

Ale*_*ler 17

定义基本接口并从中派生您的实现.将它们放入动态库(DLL/SO)并在运行时加载它们.该库只需要一个静态工厂函数来向您提供其实现的实例.

// shared
class Base {
 public:
   virtual void DoTheWork() = 0;
};

// within the DLL/SO
class Hotplugged : public Base {
  public:
   virtual void DoTheWork() {
      std::cout<<"I got hotplugged!"<<std::endl;
   }
};

extern "C" Base* CreateIt() {
  return new Hotplugged();
} 

// within the app (sample for Windows/MSVC)
... ::LoadLibrary("mydll");
Base* (*fpCreateIt)() = (Base*(*)())::GetProcAddress(... "CreateIt");
// call the function pointer to obtain a Base instance
Base* mybase = fpCreateIt();

// prints the above text
mybase->DoTheWork(); 
delete mybase;
Run Code Online (Sandbox Code Playgroud)

注意:这只是一个草图.它有一些缺陷,例如我忽略了所有权语义,如果刚刚加载的DLL与我们二进制兼容,则不会进行实际检查.考虑一下,或者寻找现有的实现(其他一些在其他响应中提到).


Ree*_*sey 6

这个有可能.对于跨平台工作(至少只重新编译),您可能希望查看执行此操作的一些现有框架.

OpenSceneGraph包含一个功能齐全的"热插拔"实现,用于加载和卸载插件.

Qt也有一个插件框架.

"技巧"是为您的插件提供一个干净的界面,并且只使用可以加载和卸载的动态库.几乎每个平台(所有主要平台)都支持动态加载和卸载库,因此没有什么能阻止它工作.