我正在寻找“热插拔” C++代码库。我对使这种技术在Linux/Mac/Windows之间跨平台工作很感兴趣。基本上,我想拥有定义所有可调用接口(interface)的主程序#include“StateMachine.h”。然后在运行时和执行期间加载和卸载StateMachineLibrary.a,以使我的应用程序使用不同的状态机。

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

动机是我项目的状态机部分将经常更改并且需要重新编译,这也将允许主应用程序在加载不同的状态机的情况下继续运行。由于某些原因,我希望使用类似Lua脚本的“可热插拔”库INSTEAD OF,因此考虑到已经探索了一种替代方法。

最佳答案

定义一个基本接口(interface)并从中导出您的实现。将它们放入动态库(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;

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

关于c++ - 可以热插拔的C++库吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3103691/

10-12 14:12