MEX文件调试—MATLAB调用C++程序—混合编程

本文介绍如何在MATLAB环境下配置并调用C++程序,包括mex工具的安装与设置、编译链接过程及调试技巧。通过具体实例演示了如何创建可被MATLAB调用的DLL文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • MATLAB要调用C++程序步骤:

1. 在MATLAB命令行敲:mex -setup,选择你所使用的C++版本,装上mex
2. 用“mex [参数] *.cpp”, eg:mex -O -c svm.cpp
这时在当前目录下就会生成*.mexw32,*.mexw64的文件,这个文件类似于c++的dll文件,MATLAB可以直接调用。

 

当前,上述的cpp文件不是我们平时所写的以main函数为入口,而是是mexFunction函数为入口,当然,还有其他不同,以下会进一步说明。

Mex文件的产生和调试(版本:VC++6.0和MATLAB7.0):(网上的实例不对,我在此进行了修正,请注意:删除线化掉的部分)

1. 建立 MFC 动态链接工程 

(1) 建立一个名为 sum_prod 的 MFC 动态链接工程 

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

(3) 在 Sample 目录下会生成 sum_prod.cpp 和 sum_prod.def 这两个文件。

2 、 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.liblibmatlbmx.lib libmat.lib 

设置完成。

3.MATLAB设置: 

(1) 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 工具条 。MATLAB7.0,输入的是:cd(prefdir); savepath prefdir;就可以了,其他版本未知。

4.添加 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

{

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 函数 

mex 函数

5 、 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 测试成功! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值