如何把MATLAB编译成C++模块
2016-11-01 14:55
218 查看
Matlab擅长计算,特别是矩阵计算,C++是通用型语言,工作中有时需要把Matlab的代码计算模块编进C++的主工程里,今天就把这些步骤介绍给大家。
环境:Matlab 2015a VS2013
1、首先在Matlab的命令行输入mbuild -setup
![](https://img-blog.csdn.net/20161101141815386?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我的电脑已经装过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++库
![](https://img-blog.csdn.net/20161101142629494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
选择第3项后会弹出新的对话框,注意划红色框的地方:
![](https://img-blog.csdn.net/20161101142939511?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
名称那里改成你自己想要的模块名称,我的叫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工程,不行………………
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
报错说找不到surf_aInitialize的引用,也就是说surf_a.lib没找到,明明就在那里。其实问题在于我们装的Matlab是64位版,它编译出来的模块也是64位的,所以我们要把VC工程改为X64模式:
![](https://img-blog.csdn.net/20161101145201644?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再编译,OK
4、编译完了自然要运行一下,靠,又出问题了,这么简单的一个函数调用花了几秒钟。
经查,其实是初始化,即surf_aInitialize()造成的,不必大惊小怪。
环境: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工程,不行………………
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
报错说找不到surf_aInitialize的引用,也就是说surf_a.lib没找到,明明就在那里。其实问题在于我们装的Matlab是64位版,它编译出来的模块也是64位的,所以我们要把VC工程改为X64模式:
再编译,OK
4、编译完了自然要运行一下,靠,又出问题了,这么简单的一个函数调用花了几秒钟。
经查,其实是初始化,即surf_aInitialize()造成的,不必大惊小怪。
相关文章推荐
- 如何在 Visual C++.NET 2003 下编译eMule
- 如何在编译时刻判断两个类型是否可以自动转换?——《Modern C++ Design》读书笔记(1)
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- 教你编译Matlab时如何让exe文件带上自己想要的图标
- 如何在 Visual C++.NET 2003 下编译eMule
- 如何在 Visual C++.NET 2003 下编译eMule
- 如何加快C++代码的编译速度
- Visual Studio 2005中如何编译和运行C++程序【转载】
- 如何用MinGW 命令行编译链接c/c++
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的
- [C++] 如何在 C++ Builder 3.0 下编译含有 MFC 的程序?
- 如何在 Visual C++.NET 2003 下编译eMule
- 如何在 Visual C++.NET 2003 下编译eMule
- C++ 接口与实现分离技术---如何将文件间的编译关系降至最低
- 如何把自己的驱动编译进内核或模块
- C++中频繁引用的类如何避免不必要的重编译
- 恶搞一下:如何将C++代码和C#代码一起编译
- C++中在多个编译单元中如何定义常量
- 如何编译/交叉编译内核模块, Linux 2.6.
- 如何加快C++代码的编译速度