Matlab 7.1+ 和 Visual Studio 2005
一篇介绍如何使用 Visual Studio 2005 编译 Matlab 7.1-7.4 mexw32 文件的文章

引言
这个程序演示了如何使用 Visual Studio 2005 编译和链接新的 Matlab mexw32 文件。 Matlab 7.1 将其 mex 文件格式从 .dll 更改为 .mexw32。所有新版本,MATLAB 7.1 (R14SP3)、MATLAB 7.2 (R2006a)、MATLAB 7.3 (R2006b) 和 MATLAB 7.4 (R2007a) 编译 mexw32 文件。以前编译的 mex .dll 必须重新编译。使用 Visual Studio 2005 使这个过程变得容易。此外,很多时候需要使用来自其他 C/C++ 函数的外部头文件和库。在这些情况下,Visual Studio 比 Matlab 自己的编译器工作得更好。 Mex 文件允许创建非常强大的 Matlab 函数,并且能够使用 .m Matlab 脚本文件的所有功能。
背景
我最初为什么学习这个? 我需要从 Matlab 控制激光陀螺仪。 我有从命令提示符控制激光的 C 函数,所以我需要在 Matlab mexw32 文件中实现 C 代码。 我不仅需要添加 mex 文件的库和头文件来进行编译,还需要添加激光库。 我的示例代码包含对激光设备的函数调用,但它们被注释掉了,因为如果没有正确的库,它们将无法编译。 您可以为自己的特定函数调用,使用我的代码。 - A. Bryant Nichols Jr.
Using the Code
您可以打开我的解决方案文件,并修改属性以链接到您的 matlab 目录,或者按照以下步骤操作:
- 创建一个新的 C++ Win32 控制台应用程序。
- 从 MATLAB 包含目录 matlab\extern\include 将 mexversion.rc 添加到项目中。
- 使用以下文本创建一个 .def 文件,并将其添加到解决方案中。
注意:将myFileName
更改为您的文件名。LIBRARY myFileName EXPORTS mexFunction
- 在 C/C++ 常规附加包含目录中,添加 matlab\extern\include。
- 在 C/C++ 预处理器属性中,将
MATLAB_MEX_FILE
添加为预处理器定义。 - 在 Linker General Output File(链接器常规输出文件)中,更改为 .mexw32
- 在 Linker General Additional Library Directories(链接器常规附加库目录)中,添加 matlab\extern\lib\win32\microsoft
- 在 Linker Input Additional Dependencies(链接器输入附加依赖项)中,添加 libmx.lib、libmex.lib 和
libmat.lib
作为附加依赖项。 - 在 Linker Input Module Definition File(链接器输入模块定义文件)中,添加您创建的 (.def) 文件。
- 在 General Configuration Type(常规配置类型)中,选择 .dll。
- 添加更多指向您程序所需的包含和库的链接。 在我的例子中,我还添加了激光陀螺仪的 \include 和 \lib 依赖项。
代码
Matlab 所需的头文件。 注意:包含您自己的头文件以获得更具体的函数。
#include "stdafx.h"
#include "Windows.h"
#include "mex.h"
#include "matrix.h"
//#include "AerSys.h"
这是我自己的函数,用于控制激光。
void StartDevice();
这是 mex 文件的主要入口点。 nlhs
是输出的数量,*plhs
是输出指针,rlhs
是输入的数量,*prhs
是输入指针。
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
从输入读取的第一个变量是 iCase
,它用于 case
语句。 有关所有可能的输入/输出选项,请参阅 Sample(示例)部分。
if (nrhs>0)
{
data1 = mxGetPr(prhs[0]);
iCase = (int)data1[0];
}
if (nrhs>1)
{
data1 = mxGetPr(prhs[1]);
dist1 = data1[0];
if (iCase==4)
{
char buf[128];
mwSize buflen;
// Allocate enough memory to hold the converted string.
buflen = mxGetNumberOfElements(prhs[1]) + 1;
mxGetString(prhs[1], buf, buflen);
sprintf_s(szProgram,buf);
}
}
if (nrhs>2)
{
data1 = mxGetPr(prhs[2]);
dist2 = data1[0];
}
StartDevice();
if (iCase==3)
{
if (nlhs>=2)
{
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
data1 = mxGetPr(plhs[0]);
data1[0] = dXPos/AZCOUNTS;
data1 = mxGetPr(plhs[1]);
data1[0] = dYPos/ELCOUNTS;
}
}
return;
这是对我的函数的调用,但是如果没有正确的激光设备库,它将无法编译。
void StartDevice()
示例 Matlab 命令
这些是可以在 Matlab 中用于运行激光的可选命令。 注意:即使文件名是 MatlabVS.m,如果有人在 Matlab 命令提示符下键入 MatlabVS(1);
,则 MatlabVS.mexw32 文件将获得优先级并被运行。 这是一种注释您的 mexw32 文件的好方法,以便用户可以理解其用法格式。
% function MatlabVS(option, var1, var2)
%
% 0) To Reset...
% MatlabVS(0);
%
% 1) To Initialize...
% MatlabVS(1);
%
% 2) To Absolute Move...
% MatlabVS(2,Xdist,Ydist);
%
% 3) To Return Positions
% [AZ,EL]=MatlabVS(3);
%
% 4) To Run GCode...
% MatlabVS(4,FileName);
% e.g. MatlabVS(4,'Aero.pgm');
%
% 5) To Increment Move...
% MatlabVS(5,Xdist,Ydist);
%
% 6) To Home...
% MatlabVS(6);
关注点
Matlab 是一个用于数组和矩阵计算、绘图、分析等的绝佳工具。 在 Matlab mexw32 文件中使用 C/C++ 还可以从外部 C 控制的设备获取实时数据,并在 Matlab 中立即进行分析。 使用 Matlab 7.1+ 和 Visual Studio 2005,天空才是极限!
历史
- 版本 1.1