【问题标题】:C++ Dynamically load classesC++ 动态加载类
【发布时间】:2013-05-05 22:39:04
【问题描述】:

我对 C++ 还是有点陌生​​,所以请忍受我的菜鸟。

我想要的是能够让我的程序的用户能够添加他自己的类。我有一个抽象类Module,我的应用程序由一组Module 的子类组成。

是否可以搜索特定目录并动态加载Module(由用户添加)的子类?

在 Java 中,我可以使用 org.reflections API 来实现这一点。 我猜 C++ 等价物正在使用 DLL。我可能错了。

提前致谢。

【问题讨论】:

  • 是的,可以使用动态链接共享库。当然,这将是特定于平台的。您可以考虑使用Qt (Qt plugins) 或其他一些插件系统。

标签: c++ class dynamic dll load


【解决方案1】:

据我所知,C++ 编译模型没有明确、直接的“导出类”方式。但是,您应该可以使用简单的 C 接口来完成:

#include "MyModule.h"

// class MyModule inherits Module

extern "C" Module * create_module() { return new MyModule; }
extern "C" void free_module(Module * p) { delete p; }

现在您可以动态加载该库并检索函数create_modulefree_module,并将它们的函数指针动态添加到您的系统:

std::map<std::string, std::pair<Module * (*)(), void(*)(Module *)> plugins;

plugins["MyClass"] = std::make_pair(..., ...);   // the dynamically resolved
                                                 // function addresses

事实上,您可能甚至不需要销毁器函数,因为普通的虚拟析构器机制即使在动态加载的库中也应该可以工作。

例如:

std::unique_ptr<Module> make_module(std::string const & s)
{
    auto it = plugins.find(s);

    return { it == plugins.end() ? nullptr : it->second.first() };
}

【讨论】:

  • 在需要保持 ABI 稳定性的情况下,以这种方式动态加载 c++ 类有许多注意事项。见community.kde.org/Policies/…
  • 不错的解决方案。您可以找到与 Kerrek 提供的上下文相同的方式 here
猜你喜欢
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2014-09-27
  • 2021-02-08
  • 2012-10-10
  • 2016-08-02
相关资源
最近更新 更多