如何从C++调用Matlab函数

Amr*_*dan 15 c c++ matlab matlab-engine matlab-deployment

我想在我的C++项目中调用MATLAB函数.

我正在使用Matlab R2010a和Visual Studio 2010

首先我创建了一个简单的matlab函数:

function y = foo(x)
    y = x+1;
Run Code Online (Sandbox Code Playgroud)

然后我用matlab编译器使用matlab GUI编译器编译这个函数(File-> new - > Deployment Project然后选择C++ shared Library).它生成这个文件2个文件夹:distrib和src.

distrib包含:

  1. foo.dll
  2. foo.h中
  3. foo.lib

src包含:

  1. Foo.cpp中
  2. foo.dll
  3. foo.exp
  4. foo.exports
  5. foo.h中
  6. foo.lib
  7. foo_mcc_component_data.c

我想在C++应用程序中使用此文件.我尝试了很多次,但我找不到办法.我在互联网上找到的所有方法都使用旧的matlab编译器,它可以生成不同的文件或在旧版本的visual studio上工作.

所以,任何人都可以帮助我吗?

我必须做什么?我必须添加哪些文件/参考文件?我必须定义哪些路径?

小智 12

也许为时已晚,但对未来而言.

包括foo.h.

添加C/C++ - 通用 - 附加包含目录到matlab header(C:\Program Files (x86)\MATLAB\R2009b\extern\include)的方式.

添加foo.lib,mclmcrrt.lib以及mclcommain.lib用于链接器在附加依赖.

对于连接附加库目录显示的方式,以您的MATLAB库(C:\Program Files (x86)\MATLAB\R2009b\extern\lib\win32\microsoft用于32位版本(MATLAB和VS的版本应该是一样的.我必须安装第二Matlab的32位版本.)).

foo.lib在我的系统路径中添加了方法.

在使用库之前foo.dll,应初始化MCR和库函数.

mclInitializeApplication(NULL,0);
fooInitialize(); 
Run Code Online (Sandbox Code Playgroud)

使用后别忘了:

mclTerminateApplication();
fooTerminate();
Run Code Online (Sandbox Code Playgroud)

和一些演示代码,看起来像:

int num = 1;
double numbrIn = 1.5;
std::cout<<"now we have " << numbrIn << std::endl;
mwArray array_in(num, 1, mxDOUBLE_CLASS, mxREAL);
array_in.SetData(&numbrIn,num);
mwArray array_out;
foo(1, array_out, array_in);
array_out.GetData(&numbrIn, num);
std::cout<<"now we have " << numbrIn << std::endl;
Run Code Online (Sandbox Code Playgroud)


And*_*ron 3

编译您的应用程序需要foo.h这些文件。foo.libfoo.dll文件需要与生成的应用程序一起提供,通常位于同一目录中。

如果将该foo.h文件放在与源文件相同的目录中,则无需对#include "foo.h". foo.lib您还可以在外部链接器依赖项中添加直接路径。

如果您想将这些文件存储在项目文件夹之外和/或在其他应用程序中重复使用这些文件,您可以阅读VC++ 目录、项目和解决方案

编辑:您可能还需要将 MATLAB 库添加到您的包含路径和库路径中。查看 MathWorks 支持解决方案为什么在尝试编译独立应用程序时会收到错误“找不到包含文件“mclmcrrt.h””?