注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令输入后可能会找不到vs2010编译器。
2.书写m文件
示例如下:
function [ c ] =
MyAdd( a,b )
%UNTITLED Summary of
this function goes here
% Detailed explanation goes here
c=a+b;
end
保存为MyAdd.m
3.创建动态链接库
Matlab中输入:mcc -W
cpplib:libMyAdd -T link:lib MyAdd -d [生成文件路径]
其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。运行完之后,你的目录下面,将会出现以下一些文件:libMyAdd.cpplibMyAdd.explibMyAdd.dlllibMyAdd.exportslibMyAdd.hlibMyAdd.libmccExcludedFiles.logreadme.txt具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件在这个头文件的最后,你可以看到下面的内容:extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c, const mwArray& a, const mwArray& b);这就是MyAdd的C函数的声明。nargout表示输出变量的个数,a,b,c就是对应了m函数的几个变量。注意,a,b,c三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。
4.系统环境配置
Computer - > Properties -> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下为MATLAB
2012软件安装目录)
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
Computer - > Properties -> Advanced system settings -> Environment Variables -> System Variables -> path, 添加
...\MATLAB\runtime\win32;
...\MATLAB\bin;
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
5.vs2010环境配置
a.创建一个console application,并新建一个cpp文件(否则之后Property Pages中没有C/C++目录)
b. 设置目录
①Property Pages -> VC++ Directories -> Include Directories, 添加(安装目录下)
...\MATLAB\extern\include\
②Property Pages -> VC++ Directories -> Library Directories, 添加
...\MATLAB\extern\lib\win32\microsoft
③Property Pages -> C/C++ -> General -> Additional Include Directories, 添加
...\MATLAB\extern\include\
④Property Pages -> Linker -> General -> Additional Library Directories, 添加
...\MATLAB\extern\lib\win32\microsoft
⑤Property Pages -> Linker -> Input -> Additional Dependencies, 添加
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
libMyAdd.lib
6.vs2010下完成程序
把刚才生成的lib*.h lib*.dll lib*.lib文件复制到刚刚新建的工程的文件夹下,并且用添加—现有项添加的工程中。(此处的*代表你的m文件名称)
其中testmat3.cpp程序如下:
#include
#include
#include
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "libMyAdd.h"
using namespace std;
int main()
{
double a = 6;
double b = 9;
double c;
// initialize lib,这里必须做初始化!
if( !libMyAddInitialize())
{
std::cout <
libMyAdd!" << std::endl;
return -1;
}
// 为变量分配内存空间,可以查帮助mwArray
mwArray mwA(1, 1, mxDOUBLE_CLASS); //
1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS);
// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
// using my add,掉我自己写的函数
MyAdd(1, mwC, mwA, mwB);
// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值
c = mwC.Get(1, 1);
std::cout<
<
// 后面是一些终止调用的程序
// terminate the lib
libMyAddTerminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
7. 程序运行结果:
出现此结果基本上就说明混合编程成功了。
注:如果m文件中有画图方面的函数,则前边一定要有延时函数,或者在c程序中m函数调用后加上getchar(),否则当lib和MCR被terminated后图像会被关闭----即程序运行后会出现图像“一闪而过”的效果!
8. 参考资料:
(1)<>
by lihui-mn@163.com
(2)<
与c++混合编程>> --------matlab r2011a and
vs2010
以上过程其实还大可简化。如有问题,欢迎交流!