调用MATLAB Engine错误:您的计算机缺少libeng.dll

时间:2016-05-26 20:28:42

标签: c++ matlab matlab-engine

我正在努力从一个简单的.cpp程序中调用MATLAB,尽管这个问题有许多在线资源。

我的目标:

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

我做了什么:

在.cpp文件属性页面中,我有: 1)将平台更改为活动(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。请尝试重新安装该程序以解决此问题。“

2 个答案:

答案 0 :(得分:2)

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

实际上,您会过度定义不同的目录(请参阅&#34;路径编辑&#34;链接)。 这就足够了:

  1. 项目属性 - &gt; VC ++目录 - &gt;图书馆目录。在这里添加路径 C:\ Program Files \ MATLAB \ R2016a \ bin \ win64 (版本和路径可能不同,但想法是到MATLAB的同一文件夹的路径)
  2. 项目属性 - &gt; C / C ++ - &gt;一般 - &gt;附加包含目录。添加路径 C:\ Program Files \ MATLAB \ R2016a \ extern \ include (此文件夹的路径)
  3. 项目属性 - &gt;链接器 - &gt;一般 - &gt;其他图书馆目录。添加路径 C:\ Program Files \ MATLAB \ R2016a \ extern \ lib \ win64 \ microsoft
  4. 项目属性 - &gt;链接器 - &gt;输入 - &gt;额外的依赖关系。在这里添加: libeng.lib; libmx.lib;
  5. 最后也是最重要的:将MATLAB Engine dll库的路径添加到Windows中。这一步解决了您的问题。我们可以这样做:我的电脑 - &gt;右键单击:设置。打开窗口系统。左下角:高级系统设置
  6. enter image description here

    高级标签

    enter image description here

    在您的用户的环境变量中,按“创建...”按钮并添加以下内容: 变量名称:PATH 变量值: C:\ Program Files \ MATLAB \ R2016a \ bin \ win64

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

    希望它能帮助一些开始使用MATLAB和C ++的人!

答案 1 :(得分:-4)

在此处按照我的说明操作:

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 然后应用。 在转到下一部分之前,请确保更改。 仔细检查拼写并确保目录存在于您的 平台。

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

    转到属性页顶部的配置栏。 您绝对想从这个设置开始。 如果需要,请选择配置、调试或发布,或“所有配置” 更改适用于调试和发布,否则您将不得不全部执行 再次为其他配置。这可能不是一个坏主意,因为 单独的发布选项通常是更“优化”的版本 相应的调试选项。注意你可以运行 在之间切换时更改属性值遇到了严重的麻烦 调试和发布模式,如果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++ 预编译头文件下,选择“不使用预编译头文件”。 (在发布模式下设置为“是”)

    在链接器常规下,将库目录添加到字段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;
    }