如何从C++调用Matlab函数

15

我希望在我的C++项目中调用MATLAB函数。

我正在使用Matlab R2010a和Visual Studio 2010。

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

function y = foo(x)
    y = x+1;

我使用matlab编译器通过matlab GUI编译器(文件->新建->部署项目,然后选择C++共享库)编译了这个函数,它生成了两个文件夹: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。

所以,请问有人能帮助我吗?

我该怎么做?我需要添加哪些文件/引用以及添加到哪里?我必须定义什么路径?

2个回答

12

也许已经有点晚了,但为了将来考虑。

包含foo.h

C/C++-General-Additional Include Directories中添加Matlab头文件的路径(C:\Program Files (x86)\MATLAB\R2009b\extern\include)。

Linker in Additional Dependencies中添加foo.libmclmcrrt.libmclcommain.lib

对于链接器中的Additional Library Directories,显示到您的 MATLAB libs 的路径(32位版本为C:\Program Files (x86)\MATLAB\R2009b\extern\lib\win32\microsoft(Matlab和VS版本应该相同。我不得不安装第二个Matlab 32位版本。)。

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

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

mclInitializeApplication(NULL,0);
fooInitialize(); 

使用后别忘了:

mclTerminateApplication();
fooTerminate();

还有一些演示代码,看起来像这样:

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;

3
需要编译您的应用程序时,将需要文件foo.hfoo.libfoo.dll文件需要与您的应用程序一起发送,通常在同一目录中。
如果您将foo.h文件放在源文件相同的目录中,则无需特别处理#include "foo.h"。您还可以在外部链接器依赖项中添加foo.lib的直接路径。
如果您想将这些文件存储在项目文件夹之外并/或在其他应用程序中重复使用这些文件,则可以阅读有关VC++目录、项目和解决方案的信息。
编辑:您可能还需要将MATLAB库添加到包含和库路径中。请查看MathWorks支持解决方案为什么在尝试编译独立应用程序时会收到错误“找不到包括文件'mclmcrrt.h'”?

我只在头文件中添加了foo.h,然后创建了一个main.cpp文件,将foo.h包含进去,并打开项目属性,然后转到链接器并将foo.lib添加到附加依赖项中。但是,当构建项目时,会出现无法打开两个源文件的错误 #include "mclmcrrt.h" #include "mclcppclass.h" 这两个文件位于foo.h中。你能帮我解决这个问题吗? - Amr Ramadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接