思路:为了实现C++与Matlab混合编程,采用由m文件构造动态链接库然后在visual studio中调用的方法。
系统:Windows 7旗舰版(64位),VS2012旗舰版,Matlab R2014a
1、Matlab中dll文件创建
1.1 m文件编写
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
1.2 设置编译器
>>mbuild -setup
MBUILD 配置为使用 'Microsoft Visual C++ 2012 (C)' 以进行 C 语言编译。
要选择不同的 C 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2012 (C) mex -setup:C:\Users\jdc\AppData\Roaming\MathWorks\MATLAB\R2014a\MBUILD_C_win64.xml C -client MBUILD
Microsoft Visual C++ 2010 (C) mex -setup:D:\MATLAB\R2014a\bin\win64\mexopts\msvc2010.xml C -client MBUILD
要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++ -client MBUILD
mex -setup FORTRAN -client MBUILD
这里我选择的是: mex -setup C++ -client MBUILD
要选择不同的 C++ 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2012 mex -setup:C:\Users\jdc\AppData\Roaming\MathWorks\MATLAB\R2014a\MBUILD_C++_win64.xml C++ -client MBUILD
Microsoft Visual C++ 2010 mex -setup:D:\MATLAB\R2014a\bin\win64\mexopts\msvcpp2010.xml C++ -client MBUILD
选择:Microsoft Visual C++ 2012
1.3 DLL的生成
在MATLAB命令框中输入以下命令:(确保)
mcc -W cpplib:libmyadd2 -T link:lib myadd2.m
生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll 等文件,将这三个文件拷到VS的项目目录下
2、VS2012调用DLL
2.1 新建vs项目,并设置环境
新建一个win32 控制台应用程序,我取名matlabMyaddtest.。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效。若建新的项目需要重新配置。
项目建好后将libmyadd2.lib, libmyadd2.h, libmyadd2.dll三个文件拷贝到项目目录下。
首先配置项目属性页/配置属性/VC++目录,根据自己电脑上软件的安装位置对照设置,如下图所示:
其次配置项目属性页/配置属性/链接器/输入/附加依赖项,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib(三个之间回车),如下图所示:
注意:与自己电脑系统相对应的bin路径还需要加入到系统环境变量中,我的电脑是D:\MATLAB\R2014a\bin\win64,如下图所示:
配置工作到此结束。
2.2编写主程序,调试运行
#include <iostream>
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
int main(int argc, char* argv[])
{
std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
/* if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
} */
// initialize lib(必须)
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
int i;
for( i=0; i<4; ++i)
{
aData[i] = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ", " << aData[1] << std::endl;
std::cout << aData[2] << ", " << aData[3] << std::endl;
a.SetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2, mxDOUBLE_CLASS);//mxDOUBLE_CLASS表示变量的精度
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// copy data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// copy data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ", " << yData[1] << std::endl;
std::cout << yData[2] << ", " << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ", " << zData[1] << std::endl;
std::cout << zData[2] << ", " << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
程序运行结果如下: