gpt4 book ai didi

c++ - 非托管 C++ : How to dynamically load code?

转载 作者:行者123 更新时间:2023-11-30 02:12:22 24 4
gpt4 key购买 nike

我们的行业是高性能分布式并行计算。我们有一个使用 Visual Studio 2008 开发的非托管 C++ 应用程序。

我们的应用程序(更像是一个框架)应该能够动态加载3rd方(可以有很多dll)开发的符合我们接口(interface)规范的代码(算法),并调用加载的代码得到一些结果.

将其想象成您想调用 sin(x) 函数,但您可以使用 sin(x) 的许多不同实现。

我有几个问题,因为我对动态加载代码这个领域还很陌生:

  1. dll(动态链接库)是这类需求的答案吗?
  2. 如果第 3 方使用与我的不同类型的 IDE 来创建 dll(例如 Eclipse CDT、C++Builder、Visual C++ 6.0 等),该 dll 是否仍适用于我的应用程序?
  3. 我们的应用程序应该也可以跨平台工作(应该能够在 Linux 上运行),将使用 QLibrary是抽象所有特定于平台的 dll 加载的最合乎逻辑的方法吗?
  4. (可选)我可能会遇到一些无法预料的问题吗?

最佳答案

1) 一般来说,是的。如果 API 变得复杂和多对象,我会使用 COM 或类似的机制。但是,如果您只需要管理一点点状态,或者可以完全无状态,那么纯 DLL 接口(interface)就可以了。

2) 使用合适的调用约定 (stdcall) 和数据类型。我什至不认为实现必须在 C++ 中。所以这意味着 char/wchar_t,显式大小的整数,例如int32、float 和 double,以及它们的 C 风格数组。

3) 不能说

4)没有跨界内存分配:释放你分配的东西,让插件释放它分配的东西。

您的 API 设计对可实现的性能和实现工作有很大影响。不要让功能变小,给实现一些自由,让它如何处理某些事情、定义错误协议(protocol)、线程要求等。

[编辑]
此外,如果您声明结构,请查看对齐和编译器选项来控制它(通常是#pragma pack)。这是必需的,以便客户看到相同的布局。

编译器通常会“破坏”导出符号的名称(例如,为 STDCALL 约定添加一个 udnerscore)。通常,这是通过传递给链接器的 .def 文件来控制的。

关于c++ - 非托管 C++ : How to dynamically load code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com