如何在 VC++6.0 环境中编译与调试 mex 程序
作者:陆振波
单位:海军工程大学
电子邮件: luzhenbo@yahoo.com.cn
个人主页: http://luzhenbo.88uu.com.cn/
1 、编写 Matlab 函数
函数文件 sum_prod.m ,内容如下:
function [sum,prod] = sum_prod(p1,p2)
sum = p1+p2; % p1 与 p2 的和
prod = p1.*p2; % p1 与 p2 的点乘
该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成 C++ 环境可用的代码的方法。
2 、 Matlab6.5 编译器设置
(1) 在同一台电脑上安装 Matlab6.5 和 Visual C++6.0 ;
(2) mex 命令设置
(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 Matlab 编译器;
(b) 命令窗口出现如下提示:
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示:
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio
[2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[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 的编译器
(3) mbuild 命令设置
(a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 Matlab 编译器;
(b) 命令窗口出现如下提示:
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
此时键入 ”y” ,按回车;
(c) 命令窗口出现如下提示:
[1] Lcc C version 2.4 in C:\MATLAB6P5\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 的编译器
(4) 在 Matlab 的命令窗口 (Command Window) 键入“ cd(prefdir); mccsavepath prefdir; ” 启动 MATLAB add-in 工具条
3 、建立 MFC 动态链接工程
(1) 建立一个名为 sum_prod 的 MFC 动态链接工程 ,如下图所示

(2) 单击 OK 按钮,出现如下对话框,选择使用 静态链接 MFC 的 DLL ,如下图如示,其它采用默认设置。

(3) 在 Sample 目录下会生成 sum_prod.cpp 和 sum_prod.def 这两个文件。
4 、 VC++6.0 环境及工程设置
在上面的 VC 工程中,进行以下设置
(1) VC++6.0 环境设置
单击菜单 Tools ,出现如下菜单

单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:
C:\MATLAB6P5\EXTERN\INCLUDE
如下图所示

在 Library files 里面加入:
C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
如下图所示

(2) VC++6.0 工程设置
单击菜单 Project ,出现如下菜单

单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 libmx.lib libmex.lib libmatlbmx.lib libmat.lib ,如下图所示

设置完成。
5 、添加 mexFunction 函数代码
(1) 打开 sum_prod.def 文件,在“ EXPORTS ”后面加入 mexFunction 一行 ,声明 mexFunction 函数为导出函数,下面是编辑后的 sum_prod.def 文件内容

(2) 打开 sum_prod.cpp 文件,在该文件尾部添加 mexFunction 函数代码 。也可以将 mexFunction 函数代码用另外一个 cpp 文件保存,在每个文件的开始应加上这一行
#include "stdafx.h"
(3) 与第 1 步 Maltab 函数相对应的 mexFunction 函数代码如下:
#include "mex.h" // mx,mex 函数头文件
// 定义输入参数
#define P1 prhs[0]
#define P2 prhs[1]
// 定义输出参数
#define SUM plhs[0]
#define PROD plhs[1]
// 定义 C 运算函数
void SUM_PROD_RUN(double *sum,
double *prod,
double *p1,
double *p2,
int m1,
int n1)
{
// C 源程序代码
int i;
for (i=0;i<m1*n1;i++)
{
sum[i] = p1[i]+p2[i];
prod[i] = p1[i]*p2[i];
}
}
void
mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组
int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组
{
int m1,n1,m2,n2;
double *p1,*p2,*sum,*prod;
// 取得输出矩阵的行列数
m1 = mxGetM(P1);
n1 = mxGetN(P1);
m2 = mxGetM(P2);
n2 = mxGetN(P2);
// 输入矩阵的行列数必须相等
if (m1!=m2||n1!=n2)
mexErrMsgTxt("The size of input matrix must be equal!\n");
// 为输出变量分配内存空间
SUM = mxCreateDoubleMatrix(m1,n1,mxREAL);
PROD = mxCreateDoubleMatrix(m1,n1,mxREAL);
// 取得输入参数指针
p1 = mxGetPr(P1);
p2 = mxGetPr(P2);
// 取得输出参数指针
sum = mxGetPr(SUM);
prod = mxGetPr(PROD);
// 调用 C 运算函数
SUM_PROD_RUN(sum,prod,p1,p2,m1,n1);
return;
}
(4) 编译链接程序后,可以在 Debug 目录得到 sum_prod.dll ,该 DLL 就是 Matlab 环境中可直接调用的 C 语言 mex 函数
6 、 mexFunction 函数调试
(1) 在 VC++6.0 中以 Debug 方式建立以上 sum_prod 工程
(2) 单击菜单 Project ,出现如下菜单

单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Debug 标签, 在 Executable for debug session: 下面的文本框内容的后面加入 matlab.exe 的完整路径名 ,如下 图所示

接 OK 按钮。
(3) 在 mexFunction 源程序中合适的 设置断点,然后按 F5 键进入调试过程 。
(4) 进入调试过程后,就会启动 一个新的 Matlab 程序,这个 Matlab 程序的当前目录为该工程所在的位置,为了运行 sum_prod.dll ,需要 将当前目录设置为 Debug 目录 。
(5) 在 Matlab 命令窗口调用 sum_prod.dll ,程序就会停在 VC++6.0 环境里的程序断点处。此时可以 在 Context 窗口中看到最近处理的变量数值 ,并可以 随意添加 Watch 。这样就可以像调试通常的 C 程序一样对 mex 程序进行调试,如下图所示。

7 、 mexFunction 函数测试
(1) 运行 Matlab6.5 ,将 sum_prod.dll 复制到 Matlab 当前目录
(2) 在 Matlab6.5 命令窗口输入以下代码
“ p1=[1 2;3 4];p2=[5 6;7 8];[sum,prod]=sum_prod(p1,p2) ”
按回车键,得到
sum =
6 8
10 12
prod =
5 12
21 32
表明 sum_prod.dll 测试成功!
其它相关主题:
MATLAB与C++的接口问题 - mex.mat.引擎
MATLAB与VC混编-Matcom篇
Vc++下如何利用MATLAB工具箱进行数字信号处理
数学工具常见问题集
提高MATLAB运行速度和节省空间的心得合集
完整MATLAB程序下载
我与MATLAB这三年