【问题标题】:Calling MATLAB from a DLL File从 DLL 文件调用 MATLAB
【发布时间】:2019-06-27 21:15:32
【问题描述】:

我知道这之前已经发布过,但没有一个答案对我有用。

我正在使用 VISSIM v10 并制作了一个 DLL 文件来制作外部驱动程序模型。这运作良好。 但我想要的是在 MATLAB 中实现算法,并让 DLL 文件将数据发送到 Matlab,然后 Matlab 计算更新值并将它们发送回 DLL。然后 DLL 将该值发送回 VISSIM。

因此,连同 VISSIM 提供的用于创建 DLL 文件的 .vcproj、.h 和 .cpp 文件(我使用 Microsoft Visual Studio 19),我在同一个项目文件中添加了 engine.h 文件以便能够使用引擎例程,但它为 engOpen 和 engEvalString 提供了“未解析的外部符号”错误。我在一个新的 .cpp 文件中尝试了同样的事情,它可以工作,但我怎样才能将它链接到 VISSIM..

我已将所有库和包含目录中的属性和配置类型添加为 .dll。

Tettamanti 和 Varga (2012) 提到这是能够做到这一点的方法。但它现在不适合我。帮忙?

【问题讨论】:

  • 如果您“知道之前已经发布过此内容,但没有一个答案有效”,请具体说明您看到的重复内容并告诉我们他们没有看到的原因帮助你。
  • "我已经添加了所有的库" ...但是你得到一个“未解决的外部符号错误”,它说你没有包含所有的库。另外,不要将engine.h 文件复制到您的项目中,将#include 复制到您的源文件中,并让编译器在它所属的MATLAB 目录中找到它。像这样复制文件,以后肯定会让人头疼。
  • @AndrasDeak stackoverflow.com/q/37797403/6579908 这是我在该主题上看到的链接。答案提供了一个我还不愿意尝试的替代方案。我希望能够直接在 dll 和 Matlab 之间发送和接收数据。
  • @CrisLuengo 好的。会记住这一点。做过某事。但对错误没有影响。
  • edit您的问题清楚地显示您添加到项目中的哪些库包含目录。如果您不展示您的所作所为,我们无法告诉您您做错了什么。这就是安德拉斯早些时候写下该评论的原因。你需要展示你做了什么。见minimal reproducible example

标签: matlab visual-c++ dll matlab-engine traffic-simulation


【解决方案1】:

要从您的 Vissim 外部驱动模块 Dll 内部调用 MATLAB 算法,您有以下选择:

  1. 使用MATLAB Compiler SDK for C/C++ - 此 SDK 可以帮助将 MATLAB 算法封装到一个单独的免版税 DLL 中,您可以将其与 Vissim 外部驱动模块 DLL 链接。
    • 这将为您提供最计算效率最高且开销最小的与 MATLAB 运行时的互操作性。
    • 必须熟练掌握 C/C++,因为您必须自己弄清楚很多事情;
    • 您需要 MATLAB 插件许可证才能使用此功能;
    • 您可以将您的 MATLAB DLL 免版税(连同 MATLAB 运行时库)分发给没有 MATLAB 许可证的第三方;
  2. 直接将 MATLAB 用作 COM 自动化服务器在 Vissim 外部驱动程序模块 DLL 中 - 您只需自己将 MATLAB 作为进程外 COM 自动化服务器进行管理,并认真做家务;
    • 这不需要 MATLAB 附加许可;
    • 它需要与 Vissim 安装在同一台计算机上的本地许可 MATLAB;
    • 您也需要自己弄清楚很多事情。
  3. 使用MATLAB External Engine API in C/C++,它本质上是MATLAB 外进程COM 对象的复杂包装,但具有现代C++ 风格;
    • 这为您省去了自己管理 MATLAB COM 对象的麻烦,但它再次要求您掌握现代 C++(即 C++11/C++14/C++17)功能。李>
    • 不需要额外的 MATLAB 附加许可;
    • 它需要与 Vissim 安装在同一台计算机上的本地许可 MATLAB。

我认为目前还没有一种直接将 Vissim 外部驱动程序模块 DLL 与 MATLAB 集成的简单直接的方法。所有这些都需要非琐碎的 C++ 和 COM 知识和技能。

如果您擅长现代 C++,我建议您使用选项 1 - 它提供最佳性能。

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2018-01-28
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多