1、环境设置
在桌面上右键单击“我的电脑”图标出现以下菜单
单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示
在上图中,单击“环境变量”按钮,出现“环境变量”对话框, 添加系统变量 matlab 值为 D:\\MATLAB 即 matlab 的安装路径,如下图所示
在环境变量 path 中加入 D:\\MATLAB\\bin\\win32 ,如下图所示
按“确定”完成设置后, 重启计算机或注销当前用户 ,即可应用新设置。
2、matlab 编译器设置
(1) mex 命令设置
(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 matlab 编译器;
(b) 命令窗口出现如下提示
mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示
Select a compiler:
[1] Digital Visual Fortran version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[2] Lcc C version 2.4.1 in D:\\MATLAB\\sys\\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[4] Open WATCOM C/C++ version 1.3 in D:\\Maple11
[0] None
此时键入 ”3” ,按回车 ;选择 Microsoft Visual C++6.0 的编译器
(d) 命令窗口出现如下提示
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\\Program Files\\Microsoft Visual Studio
Are these correct?([y]/n):
此时键入 ”y” ,按回车 ;确认选择 Microsoft Visual C++6.0 的编译器
(2) mbuild 命令设置
(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 matlab 编译器;
(b) 命令窗口出现如下提示
mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示
Select a compiler:
[1] Lcc C version 2.4.1 in D:\\MATLAB\\sys\\lcc
[2] Microsoft Visual C/C++ version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[0] None
此时键入 ”2” ,按回车 ;选择 Microsoft Visual C++6.0 的编译器
(d) 命令窗口出现如下提示
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\\Program Files\\Microsoft Visual Studio
Are these correct?([y]/n):
此时键入 ”y” ,按回车 ,确认选择 Microsoft Visual C++6.0 的编译器,编译器设置完成。
3、编写matlab 函数
函数文件 sum_prod.m ,内容如下:
function [sum,prod] = sum_prod(p1,p2)
sum = p1+p2; % p1 与 p2 的和
prod = p1.*p2; % p1 与 p2 的点乘
该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 VC++ 环境可用的代码的方法。
4、将 matlab 函数转成 dll 文件
在 Matlab7.0 的 Command Window 下输入命令 :
命令 : mcc -W lib:libsum_prod -T link:lib sum_prod.m –v
其中libsum_prod是需要生成的各种文件的名称,sum_prod.m为matlab函数。生成动态链接库 dll ,编译完成后, matlab 生成一些文件,其中
libsum_prod.ctf
libsum_prod.dll
libsum_prod.h
libsum_prod.lib
这些文件是我们后面需要用到的。
注意 : 该命令生成的 dll 文件接口的数据类型是 mxArray
5、VC++6.0 工程的创建与设置
(1)建立一个名为 Test 基于 MFC的单文档应用程序
添加一个新的菜单项及其子菜单
按Ctrl+W快捷键,在MFC ClassWizard中为资源ID_SUMPROD配置消息COMMAND(注意是在CMainFrame类中), 选择ADD FUNCTION,点击OK,出现OnSumprod()成员函数。
在资源视图中,插入新的对话框,添加如下的对话框,其中“运算”为删掉OK按钮后的新控件,并在MFC ClassWizard为“运算”添加响应函数OnCalculate()。
建立以该对话框为资源的对话框类,命名为CCalculate,并为各编辑框控件映射成员变量。
在MainFrm.cpp文件添加头文件#include "Calculate.h",并为OnSumprod()成员函数添加代码
void CMainFrame::OnSumprod()
{
// TODO: Add your command handler code here
CCalculate dlg;
dlg.DoModal();
}
(2)对 VC ++ 6.0 ,进行以下设置
单击菜单 Tools ,出现如下菜单
单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:
D:\\MATLAB\\EXTERN\\INCLUDE
在 Library files 里面加入:
D:\\MATLAB\\EXTERN\\LIB\\WIN32\\MICROSOFT\\MSVC71
最后的MSVC71以安装的matlab版本为准(本文版本为matlab7.1)。
(3) 对该工程,进行以下设置
单击菜单 Project,选择 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 mclmcrrt.lib
libsum_prod.lib ,如下图所示
6、代码编辑及 dll调用
(1)将前面生成的四个文件:
libsum_prod.ctf
libsum_prod.dll
libsum_prod.h
libsum_prod.lib
复制到 VC 工程所在目录。
(2) 在 VC ++ 6.0 环境中, 单击菜单 Project , 选择 Add to Project 菜单项,再单击 Files… 子菜单项,出现如下图对话框,
将 libsum_prod.h 加入到当前工程中。
(3) 在Calculate.cpp 中添加以下代码:
void CCalculate::OnCalculate()
{
// TODO: Add your control notification handler code here
//调用动态链接库
if(!libsum_prodInitialize())
{
MessageBox("加载库失败!");
}
// 声明 DLL 函数输入输出 mxArray 对象
mxArray *X,*Y;
mxArray *SUM=NULL,*PROD=NULL;
// 给输入 mxArray 对象分配内存
X = mxCreateDoubleMatrix(1,1,mxREAL);
Y = mxCreateDoubleMatrix(1,1,mxREAL);
// 给输入 mxArray 对象赋值
double p1[1][1], p2[1][1]; //必需以数组形式
UpdateData();
p1[0][0] = m_p1;
p2[0][0] = m_p2;
memcpy(mxGetPr(X),p1,sizeof(double));
memcpy(mxGetPr(Y),p2,sizeof(double));
// 调用 DLL 函数,注意输入与输出的接口是不同的
mlfSum_prod(2,&SUM,&PROD,X,Y) ;
// 返回mxArray 对象值
double *p3, *p4; //必需以指针形式
p3 = mxGetPr(SUM);
p4 = mxGetPr(PROD);
m_p3 = p3[0];
m_p4 = p4[0];
UpdateData(false);
// 释放输入输出 mxArray 对象所占用的内存
// 注意输出对象的内存是在调用 DLL 函数过程中分配的
mxDestroyArray(X);
mxDestroyArray(Y);
mxDestroyArray(SUM);
mxDestroyArray(PROD);
}
编译,链接,运行,最终结果如下。下载本文