首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >热插拔C++库有可能吗?

热插拔C++库有可能吗?
EN

Stack Overflow用户
提问于 2010-06-24 00:45:57
回答 7查看 4.7K关注 0票数 10

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

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

动机是我的项目的状态机部分将经常变化,需要重新编译,也将允许主应用程序继续运行不同的状态机正在加载。出于一些考虑,我希望使用“热插拔”库,而不是像Lua脚本那样的库,所以考虑到这是一种已经探索过的替代方案。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-06-24 00:47:31

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

代码语言:javascript
复制
// 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与我们的二进制兼容,则不会进行实际的检查。考虑一下,或者寻找现有的实现(在其他响应中提到了一些)。

票数 17
EN

Stack Overflow用户

发布于 2010-06-24 00:52:11

这是可能的。对于跨平台工作(至少仅限重新编译),您可能希望查看一些现有的框架。

OpenSceneGraph包括一个功能齐全的“热插拔”实现,用于加载和卸载插件。

Qt has a plugin framework也是如此。

“诀窍”是为你的插件提供一个干净的接口,并且只使用可以加载和卸载的动态库。几乎每个平台(所有主要平台)都支持库的动态加载和卸载,因此没有什么可以阻止它的工作。

票数 6
EN

Stack Overflow用户

发布于 2010-06-24 00:48:22

是的,这当然是有可能的。在之前的角色中,我们开发了3D图形API和应用程序,我们让用户“动态”选择显示驱动程序。视图必须重新创建,但应用程序本身不需要关闭。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3103691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档