1

尽管有很多在线资源可以解决这个问题,但我仍在努力从一个简单的 .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

路径编辑

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。尝试重新安装程序来解决这个问题。”</p>

4

2 回答 2

3

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

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

  1. 项目属性 -> VC++ 目录 -> 库目录。在此处添加路径C:\Program Files\MATLAB\R2016a\bin\win64(版本和路径可能不同,但想法是 est path 到您的 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 Engine dll 库的路径添加到您的 Windows。这一步解决了你的问题。我们可以这样做:我的电脑->右键:设置。打开的窗口系统。左下角:高级系统设置

在此处输入图像描述

高级选项卡

在此处输入图像描述

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

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

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

于 2017-08-09T13:53:38.007 回答
-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
    

    MATLAB 根目录在哪里$MATLABROOT,可以通过输入命令确定:

    matlabroot
    

    在 MATLAB 命令提示符下。

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

    这就是 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 INCLUDE DIRECTORIES:

    $MATLABROOT\extern\include
    

    IE

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

    在您输入的每一行的末尾放置一个分号,这是一条路径。在该部分中的 .lib 文件之后。

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

    在 Linker General 下,将库目录添加到字段 ADDITIONAL LIBRARY DIRECTORIES:(对于 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. 在 Linker Input 下,将以下库名称添加到标记为 ADDITIONAL DEPENDENCIES 的字段中:(在其中的任何其他内容前面使用此字符串)libeng.lib;libmat.lib;libmx.lib; 我不知道顺序是否真的很重要,但原始参考按字母倒序列出了它们。“我都听说过”。

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

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

    进入“高级系统设置”\Environment 要执行此操作,请通过单击开始 -> 右键单击​​计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 打开“路径”来检查 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" #include

    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;
    }
    
于 2021-01-28T19:58:44.057 回答