【问题标题】:Calling MATLAB Engine error: libeng.dll is missing from your computer调用 MATLAB 引擎错误:您的计算机中缺少 libeng.dll
【发布时间】:2016-05-26 20:28:41
【问题描述】:

尽管网上有很多资源可以解决这个问题,但我仍然在努力从一个简单的 .cpp 程序调用 MATLAB。

我的目标:

使用 Microsoft Visual Studio 2010 Professional 64 位构建 .cpp 程序 为内置函数和图形调用 MATLAB 引擎(MATLAB R2013b 64 位)

我做了什么:

在 .cpp 文件属性页中,我有: 1) 将平台更改为 Active(x64) 2) 将以下路径添加到 VC++ 目录 可执行目录:C:\Program Files\MATLAB\R2013b\bin 包含目录:C:\Program Files\MATLAB\R2013b\extern\include 参考目录:C:\Program Files\MATLAB\R2013b\bin\win64 库目录:C:\Program Files\MATLAB\R2013b\extern\lib\win64\microsoft

Path Edits

3) 编写了以下程序:

// mEng.cpp : Defines the entry point for the console application.
// libeng.dll is in C:\Program Files\MATLAB\R2013b\bin\win64

#include "stdafx.h"
#include <Engine.h>
#include <matrix.h>
#include <iostream>
#include <string>
#include <cmath>

#pragma comment (lib, "libmat.lib")
#pragma comment (lib, "libmx.lib")
#pragma comment (lib, "libmex.lib")
#pragma comment (lib, "libeng.lib")
#pragma comment (lib, "libut.lib")

using namespace std;


int main()
{
    Engine *m_pEngine;
    if (!(m_pEngine = engOpen(""))) 
          {
            fprintf(stderr, "\nCan't start MATLAB engine\n");
            return EXIT_FAILURE;
          }

    //Now call the MATLAB script through MATLAB Engine

          engEvalString(m_pEngine, "script");
          cout << "Hit return to continue\n\n";
          fgetc(stdin);

    //Close the MATLAB Engine

          engClose(m_pEngine);
          return EXIT_SUCCESS;
}

收到的错误:

“程序无法启动,因为您的计算机中缺少 libeng.dll。尝试重新安装程序来解决这个问题。”

【问题讨论】:

  • 您确认您的路径包含 C:\Program Files\MATLAB\R2013b\bin\win64 吗?
  • 感谢您的回复。我已经编辑了我的帖子以包含我的路径目录的屏幕截图(请参阅“路径编辑”链接)。我的路径在参考目录中确实包含 C:\Program Files\MATLAB\R2013b\bin\win64,这是您的意思吗?
  • 表示系统路径:系统将在运行时查找文件的位置。如果系统不知道去哪里寻找 libeng.dll,则说明已启动。打开命令提示符并键入path 以查看是否列出了 libeng.dll 的主页。更多信息:msdn.microsoft.com/en-CA/library/7d83bc18.aspx
  • 啊,成功了!我将 PATH=C:\Program Files\MATLAB\R2013b\bin\win64 添加到 Project Properties->Debugging 的 Environment 字段中
  • 只有在您通过 IDE 进行调试时才会如此。一旦你自己运行你的应用程序,你就会重复。建议将dll路径添加到系统PATH。您可以通过快速网络搜索了解如何为您的 Windows 版本执行此操作。

标签: c++ matlab matlab-engine


【解决方案1】:

我遇到了同样的问题,花了一天时间解决它。 所以这是我的答案。

实际上,您过度定义了不同的目录(请参阅“路径编辑”链接)。 做这些就足够了:

  1. 项目属性 -> VC++ 目录 -> 库目录。在此处添加路径 C:\Program Files\MATLAB\R2016a\bin\win64(版本和路径可能不同,但我们的想法是为您的 MATLAB 的同一文件夹估计路径)
  2. 项目属性 -> C/C++ -> 常规 -> 附加包含目录。添加路径C:\Program Files\MATLAB\R2016a\extern\include(你的这个文件夹的路径)
  3. 项目属性 -> 链接器 -> 常规 -> 附加库目录。添加路径C:\Program Files\MATLAB\R2016a\extern\lib\win64\microsoft
  4. 项目属性 -> 链接器 -> 输入 -> 附加依赖项。在此处添加:libeng.lib; libmx.lib;
  5. 最后也是最重要的:将 MATLAB 引擎 dll 库的路径添加到您的 Windows。这一步解决了你的问题。我们可以这样做:我的电脑->右键:设置。打开的窗口系统。左下角:高级系统设置

高级标签

在您的用户的环境变量中,按下 Create... 按钮并添加这个: 变量名:PATH 变量值:C:\Program Files\MATLAB\R2016a\bin\win64

此路径是您的 libeng.dll 所在位置的参考。 重要时刻:可能需要重新启动VS甚至重新启动计算机。

希望它可以帮助一些开始使用 MATLAB 和 C++ 工作的人!

【讨论】:

    【解决方案2】:

    按照我的笔记在这里:

    https://www.mathworks.com/matlabcentral/answers/100603-how-can-i-compile-a-matlab-engine-application-using-microsoft-visual-studio-9-0-or-10-0

    我想借此机会重新格式化那里给出的说明:

    要在 Microsoft Visual Studio 9.0 (2008) 或 Microsoft Visual Studio 10.0 (2010) 环境中编译 MATLAB 引擎应用程序,请执行以下步骤:

    1. 打开 Microsoft Visual Studio 并选择

      文件->新建->项目

      然后选择:

      Visual C++ -> 常规 -> 空项目

      然后,输入项目名称及其在 指定的文本区域,然后单击“确定”。

      注意这一步要非常小心,因为它会创建解决方案文件夹和 把一个项目文件夹放在那里,所以你不会想设置它,把它全部搞定 工作,然后更改文件夹,因为这会破坏解决方案,你会 必须重新开始。

    2. 右键单击 SOLUTION EXPLORER 中的 SOURCE FILES 文件夹并单击

      添加 -> “新项目...”

      选择“C++文件(.cpp)”,输入文件名 (如enginedemo.cpp)如你所愿。点击确定。

    3. 从源文件中复制代码:engwindemo.c,并将其粘贴到此 文件enginedemo.cpp。文件engwindemo.c可以从以下获取 地点:

      $MATLABROOT/extern/examples/eng_mat
      

      其中$MATLABROOT 是 MATLAB 根目录,可由下式确定 输入命令:

      matlabroot
      

      在 MATLAB 命令提示符处。

      我建议此时你在记事本中打开它,如果它有一些 奇怪的格式,修复并保存它,这样当你打开它时它看起来就像一个普通的 C 文件 它在记事本(或 gedit 或其他)中。

      这是 Visual Studio 中发生变化的地方,我希望这有所扩展 对 VS Code、Eclipse 或您想使用的任何 IDE 透明。 所以我将用罗马数字重新编号属性更改部分并修复 顺序。

      还请务必在进行每次更改后按 ENTER,然后按 APPLY。 在转到下一部分之前,请确保更改。 仔细检查拼写并确保目录存在于您的 平台。

    4. 进入解决方案资源管理器视图,右键单击项目名称并 在解决方案资源管理器中选择 PROPERTIES 以打开项目属性。 打开此窗口后,进行以下更改:

      转到属性页顶部的配置栏。 你绝对想从这个设置开始。 如果需要,请选择配置、调试或发布,或“所有配置” 更改适用于调试和发布,否则您必须全部完成 再次为其他配置。这可能不是一个坏主意,因为 单独的发布选项通常是更“优化”的版本 相应的调试选项。注意你可以运行 在切换之间更改属性值时遇到严重问题 调试和发布模式,如果IDE崩溃,请不要感到惊讶,解决方案 数据库损坏,即使调试也无法构建,而您有 重新开始。首先让调试工作,备份整个解决方案, 然后“克隆”要发布的调试设置,然后调整发布 一次设置一个,确保代码仍然可以构建和运行 每次更改之间。

      如果编译为 64 位 Windows,请将目标从 x86 更改为 x64 并使用 64- 位 DLL 和库文件。

      如果这不在它所说的最顶部的配置选项中 “配置管理器”(如在 VS2015 中),然后按照您的 IDE 说明进行操作... 如以下链接所述:

      https://www.microsoft.com/en-us/download/details.aspx?id=55984

    5. 配置属性->调试

      在环境中添加以下目标路径: (适用于 32 位 MATLAB)

      PATH=$matlabroot\bin\win32
      

      (对于 64 位 MATLAB)

      PATH=$matlabroot\bin\win64 If you want to use an absolute path instead, 
      

      使用以下内容(末尾有分号)

      PATH=C:\Program Files\MATLAB\R2013a\bin\win32; (for 32 bit MATLAB)
      PATH=C:\Program Files\MATLAB\R2013a\bin\win64; (for 64 bit MATLAB)
      

      (可能可以跳过这里的“PATH=”,因为它似乎没有保留在那里, 否则这是直接来自 MATLAB 参考)

    6. 在 C/C++ General 下,将以下目录添加到字段 ADDITIONAL 包括目录:

      $MATLABROOT\extern\include
      

      c:\Program Files\MATLAB\R2019a\extern\include;
      

      在您输入的每一行的末尾添加一个分号,即路径。后 该部分中的 .lib 文件也是如此。

      在 C/C++ Precompiled Headers 下,选择“Not Using Precompiled Headers”。 (在发布模式下设置为“是”)

      在 Linker General 下,将库目录添加到字段 ADDITIONAL 图书馆目录: (适用于 32 位 Windows)

      $MATLABROOT\extern\lib\win32\microsoft
      

      (对于 64 位 Windows)

      $MATLABROOT\extern\lib\win64\microsoft
      

      即 c:\Program Files\MATLAB\Rxxxxx\extern\lib\win(32|64)\microsoft;

    7. 在链接器输入下,将以下库名称添加到标记的字段中 其他依赖项: (在其他任何内容前面使用此字符串) libeng.lib;libmat.lib;libmx.lib; 我不知道顺序是否真的很重要,但列出了原始参考 它们按字母倒序排列。 “我都听说过”。

      好的,现在您已经完成了对 VS 项目属性页的更改,保存更改 (正如您一直所做的那样,每次更改后单击“应用”)并单击 行。属性页窗口将关闭。此时您的代码将构建 但仍然不会调用 Matlab。再次备份解决方案。

      现在更改 DOS/WINDOWS 环境路径字符串。 我会保存解决方案,关闭 VS,备份它,进行 PATH 更改并 重新打开 VS 并尝试构建您的程序并运行它并让它工作。 必须更改 PATH 字符串,以便 bin\win(32:64) 目录是 路径上第一个与 Matlab 相关的实例。

      进入“高级系统设置”\环境 为此,请单击“开始”->“右键单击”检查 Windows 系统路径 在计算机上 -> 属性 -> 高级系统设置 -> 环境 变量 -> 系统变量 -> 打开“路径”进行编辑。 并修改PATH变量:

    8. 确保以下目录位于 PATH 中: (适用于 32 位 Windows)

      $MATLABROOT\bin\win32
      

      (对于 64 位 Windows)

      $MATLABROOT\bin\win64
      

      它不一定是路径中的第一个目录,但它必须是 路径中的第一个 MATLAB 目录

      PATH=c:\;....;c:\Program Files\MATLAB\Rxxxxx\bin\win(32/64);
      

      matlab.exe 位于\bin;您可能希望在路径上也没有 在 \bin\win64 条目之前...

      注意:如果机器上安装了多个 MATLAB,目录为 目标平台必须位于任何其他 MATLAB 目录之前(对于 例如,在编译 64 位应用程序时,MATLAB 中的目录 64 位安装必须是 PATH 上的第一个)。

      还要确保您的目标安装 MATLAB 已注册为 COM 服务器:

      https://www.mathworks.com/help/matlab/ref/regmatlabserver.html 对于 Matlab 2020a 及更高版本,请尝试 comserver('query') 和 comserver('register')。 对于 2019 年及更早的版本,请使用 regmatlabserver()(以管理员身份运行 Matlab)。

    9. 构建并执行应用程序。

      所以我包含一个应该演示功能的简单应用程序: #include “stdafx.h” #include "engine.h" #包括

      using namespace std;
      int main()
      {
      Engine *eng;
      eng=engOpen("");    // put a breakpoint here
      cout << "...now you see it...\n"
      engClose(eng);      // put a breakpoint here
      cout << "...now you don't!\n"
      return 0;
      }
      

    【讨论】:

    • “你知道这是为什么,对吧?”不,我不知道,因为即使是匿名用户,我也可以在这篇文章中看到revision history。您是在谈论对此帖子的已删除评论吗?我也看不到那些。如果评论粗鲁/冒犯或不再相关,则可能会被标记,并且可能会被删除,恕不另行通知。没有人试图对您进行人身攻击。这完全是关于内容和格式的。我只想知道为什么它是这样格式化的。最近的编辑不是您想要的吗?
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2014-04-17
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多