我正在寻找“热插拔”C++代码库。我有兴趣让这项技术在Linux/Mac/Windows之间跨平台工作。基本上,我希望主程序#include "StateMachine.h“定义所有可调用的接口。然后在运行时和执行期间加载和卸载StateMachineLibrary.a,让我的应用程序使用不同的状态机。
我的一个想法是,也许可以做一些事情,比如编写一个包装器,将编译后的代码加载到我自己的malloc内存中,并在内存中创建函数指针?
动机是我的项目的状态机部分将经常变化,需要重新编译,也将允许主应用程序继续运行不同的状态机正在加载。出于一些考虑,我希望使用“热插拔”库,而不是像Lua脚本那样的库,所以考虑到这是一种已经探索过的替代方案。
发布于 2010-06-24 00:47:31
定义一个基接口并从中派生出您的实现。将它们放入动态库(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与我们的二进制兼容,则不会进行实际的检查。考虑一下,或者寻找现有的实现(在其他响应中提到了一些)。
发布于 2010-06-24 00:52:11
这是可能的。对于跨平台工作(至少仅限重新编译),您可能希望查看一些现有的框架。
OpenSceneGraph包括一个功能齐全的“热插拔”实现,用于加载和卸载插件。
Qt has a plugin framework也是如此。
“诀窍”是为你的插件提供一个干净的接口,并且只使用可以加载和卸载的动态库。几乎每个平台(所有主要平台)都支持库的动态加载和卸载,因此没有什么可以阻止它的工作。
发布于 2010-06-24 00:48:22
是的,这当然是有可能的。在之前的角色中,我们开发了3D图形API和应用程序,我们让用户“动态”选择显示驱动程序。视图必须重新创建,但应用程序本身不需要关闭。
https://stackoverflow.com/questions/3103691
复制相似问题