您的位置:首页 > 编程语言 > MATLAB

如何把MATLAB编译成C++模块

2016-11-01 14:55 218 查看
Matlab擅长计算,特别是矩阵计算,C++是通用型语言,工作中有时需要把Matlab的代码计算模块编进C++的主工程里,今天就把这些步骤介绍给大家。

环境:Matlab 2015a      VS2013

1、首先在Matlab的命令行输入mbuild -setup



我的电脑已经装过VS2010和VS2013,所以这里直接显示出来了,如果默认不是你想要的,可以输入提示的命令修改,mex -setup ........

2、我们写一个简单的Matlab函数并保存成m文件:

function res = surf_a( a,b,c )
%UNTITLED Summary of this function goes here
% res is a test function
% a is XXX
% b is XXX
% c is XXX
res = a*b+b*c+a*c;

end

%后面的是注释,res是返回值。
然后在命令行里输入deploytool,会弹出一个选择对话框,我们选第3项,生成C++库



选择第3项后会弹出新的对话框,注意划红色框的地方:



名称那里改成你自己想要的模块名称,我的叫surf_a,然后点“Package”,等待几分钟,会生成一堆文件,其中重要的是surf_a.h, surf_a.cpp, surf_a.dll, surf_a.lib等。

3、开启VS2013,新建一个win32命令行工程,把surf_a.h文件放到工程目录下并添加到工程里。把surf_a.dll, surf_a.lib放到Debug目录下。

代码如下:

#include "stdafx.h"
#include <iostream>

#include "surf_a.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
if (!surf_aInitialize())
{
//initilize failed!!!"<<std::endl;
std::cout << "错误..." << std::endl;
return -1;
}
double a = 2;
double b = 3;
double c = 4;
double d;
mwArray mwA(1, 1, mxDOUBLE_CLASS);// 1,1表示矩阵的大小
mwArray mwB(1, 1, mxDOUBLE_CLASS);// 1,1表示矩阵的大小
mwArray mwC(1, 1, mxDOUBLE_CLASS);// 1,1表示矩阵的大小
mwArray mwD(1, 1, mxDOUBLE_CLASS);// 1,1表示矩阵的大小

mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
mwC.SetData(&c, 1);
surf_a(1, mwD, mwA, mwB, mwC);
// get data
d = mwD.Get(1, 1);
printf("d=%f", d);

surf_aTerminate();

return 0;
}有文章说要包含:

#include"mclmcr.h"

#include"matrix.h"

#include"mclcppclass.h"
其实是多余的,因为surf_a.h里已经包含了。
在VS“项目属性”->“VC++目录”->“包含目录”里添加(你的不一定在D盘):

D:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\include

D:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\include\win64

在“库目录”中添加:

D:\Program Files\MATLAB\MATLAB Production Server\R2015a\bin\win64

D:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\lib

D:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\lib\win64\microsoft

在“链接器”->“输入”->“特定依赖项”中添加:

surf_a.lib;mclmcrrt.lib; libmx.lib; libmat.lib; mclmcr.lib;

当然,这里的surf_a.lib就是刚刚用Matlab编出来的,你的不一定叫这个名字注意修改。

在“链接器”->“常规”->“附加库目录”中添加:

..\Debug

这里是指定surf_a.lib的位置。

好了,编译VC工程,不行………………


报错说找不到surf_aInitialize的引用,也就是说surf_a.lib没找到,明明就在那里。其实问题在于我们装的Matlab是64位版,它编译出来的模块也是64位的,所以我们要把VC工程改为X64模式:



再编译,OK

4、编译完了自然要运行一下,靠,又出问题了,这么简单的一个函数调用花了几秒钟。

经查,其实是初始化,即surf_aInitialize()造成的,不必大惊小怪。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 C++