环境:Matlab R2010a,vs 2010 ,win7, 64位操作系统
假设有一Matlab函数文件 MyAdd.m,内容如下:
function c = MyAdd( a,b )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
c=a+b;
end
一、matlab编译环境的设置
1、 >>mex –setup
Pleasechoose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? n
这个地方如果选择y,那么就看不到vs2010 c++的编译器,只能看到C++6.0的(我电脑里装了这两个),我之前写的就是用C++6.0的编译器编译的DLL,再用VS2010可以调用成功的。如果这时候你想选择vs2010 c++的编译器,就要选择n,我想也应该可以的。
Would you like mex to locate installed compilers [y]/n? n
这个地方如果选择y,那么就看不到vs2010 c++的编译器,只能看到C++6.0的(我电脑里装了这两个),我之前写的就是用C++6.0的编译器编译的DLL,再用VS2010可以调用成功的。如果这时候你想选择vs2010 c++的编译器,就要选择n,我想也应该可以的。
接下来几个选择 y
2、>> mbuild –setup
同上1
3、然后,进行编译,命令如下:
>>mcc -W cpplib:libMyAdd -T link:lib MyAdd.m
>>mcc -W cpplib:libMyAdd -T link:lib MyAdd.m
会生成如下文件:
libMyAdd.cpp(这里有函数接口说明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib
这四个是要用到的文件。
libMyAdd.cpp(这里有函数接口说明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib
这四个是要用到的文件。
二、vs2010 配置
在Vs2010中创建一个工程(C++程序),对VC进行环境配置:
右键单击工程->属性->
(1) VC++目录,在“包含目录”中添加
C:\Program Files\MATLAB\R2012a\extern\include
(根据自己matlab安装的目录添加)
在“库目录”中添加:
C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft
(我安装的是 64位的)
(2)链接器->输入,在“附加依赖项”中添加:
mclmcrrt.lib
libMyAdd.lib
(每个.lib占一行,后面无需任何标点)
64位还需设置:
(1)右键工程->属性->链接器->高级->目标计算机
将MachineX86改为MachineX64
(2)生成->配置管理器->平台
将Win32改为x64
至此,VC配置成功。
三、vs2010 调用matlab 函数
运行之前把第一步第3小步生成的.h,.dll,.lib(libMyAdd.h libMyAdd.lib libMyAdd.dll)三个文件放在Vs++程序的工程文件夹里
#include <stdio.h>
#include <memory.h>
#include <string>
#include "libMyAdd.h"
#include <mclmcr.h>
using namespace std;
void main()
{
double a = 6;
double b = 9;
double c;
// initialize lib,这里必须做初始化!
if( !libMyAddInitialize())
{
std::cout <<"Could not initialize 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<<"c is " <<c<<std::endl;
// 后面是一些终止调用的程序
// terminate the lib
libMyAddTerminate();
// terminate MCR
mclTerminateApplication();
}