分享

Visual Studio创建Matlab mex(dll)函数

 maoj66 2014-04-11

本文主要介绍在Windows XP 32bit操作系统下,利用Visual Studio 2005,如何生成Matlab可执行的mex(dll)文件。(1). 首先,使用Visual Studio 2005编译生成动态链接库dll文件。(2). 然后,在Matlab 2009b中调用生成的mex(dll)文件。


   1). 打开Visual Studio 2005,建立一个Win32 Project,项目名为test_matlab_3

Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   2). 项目类型设定时选择DLL,并选定Export symbol和Empty project,注意要先选Export symbol再选Empty project。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   3). 然后打开project -> add new item,添加C++ file 文件名为mexFunction.cpp。文件代码后附。
Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   4). 然后打开tool -> option -> Projects and Solutions -> VC++ Directories -> Include files 增加matlab头文件目录地址。"C:\Program Files\MATLAB\R2009b\extern\include"。由于最近经常使用matlab,就把头文件目录添加到VC设置中。如果只是偶尔使用matlab,可以把头文件目录加到project -> test_matlab_3 properties -> C++ -> General -> Additional Include Directories 中。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   5). 然后打开tool -> option -> Projects and Solutions -> VC++ Directories -> Library files 增加matlab库文件目录地址。"C:\Program Files\MATLAB\R2009b\extern\lib\win32\microsoft"。如果只是偶尔使用matlab,可以把库文件目录加到project -> test_matlab_3 properties -> Linker -> General -> Additional Library Directories 中。
Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   6). 然后打开project -> test_matlab_3 properties -> C++ -> Preprocessor 添加 TEST_MATLAB_3_EXPORTS。
Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数

 
   7). 然后打开project -> test_matlab_3 properties -> C++ -> Code Generation -> Runtime Library,选择 Multi-threaded Debug (/MTd)。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数
   8). 然后打开project -> test_matlab_3 properties -> Linker -> Input -> Additional Dependencies中添加 libmx.lib,libmat.lib,libmex.lib,libeng.lib。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数


    9). 然后打开project -> test_matlab_3 properties -> Linker -> Input -> Module Definition File中添加 .\mexFunction.def。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数


    10). 然后打开project -> add new item,添加Module-Definition File 文件名为mexFunction.def。文件代码后附。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数

    11). 然后打开project -> add new item,添加Header File 文件名为mexFunction.h。文件代码后附。Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数


    12). 编译,链接,生成test_matlab_3.dll文件,也就是我们想要的mex文件。

    13). 将生成的文件拷贝到matlab目录下,执行"test_matlab_3(1,'Panpan Hu')",返回如下结果Visual <wbr>Studio创建Matlab <wbr>mex(dll)函数

注意:本质上来讲mex和dll没有区别,只是两个不同的后缀名。Matlab2010b以后版本可能不支持调用dll为后缀的mex文件。消息来源如下

http://www./help/techdoc/matlab_external/bsehn8g.html

A MEX-file is a shared library dynamically loaded at runtime. Shared libraries are sometimes called .dll files, for dynamically-linked library. MEX-files have a platform-dependent extension, which the mex function automatically assigns.

On 32-bit Windows platforms, the extension is .mexw32. MATLAB has supported .dll as a secondary MEX-file extension since Version 7.1 (R14SP3). In Version 7.7 (R2008b), if you used the -output switch to create a MEX-file with a .dll extension, MATLAB displayed a warning message that such usage is being phased out.

In MATLAB Version 7.10 (R2010a), you can no longer create a MEX-file with a .dll file extension. If you try to, MATLAB creates the MEX-file with the proper extension and displays the following warning:

Warning: Output file was specified with file extension, ".dll", which
         is not a proper MEX-file extension.  The proper extension for
         this platform, ".mexw32", will be used instead. 

MATLAB continues to execute a MEX-file with a .dll extension, but future versions of MATLAB will not support this extension.


本文参考如下网络资源

http://blog.sina.com.cn/s/blog_4d1865f00100o2ul.html

http://www.engineering./~dip/lecture/C++_with_Matlab.pdf


附录1 mexFunction.cpp

#include "mexFunction.h"
#include <string>
#include "stdlib.h"
#include <iostream>
using namespace std;
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray*prhs[] )
{
    double *Encoder_Decoder_db = NULL;
    string Path_Str="";     // the path of the bands
    unsigned int bufferlength = mxGetM(prhs[1])*mxGetN(prhs[1])+1;
    char *Path_Str_ch = new char[bufferlength];
    short Encoder_Decoder;  // 0: encoder, 1: decoder
    Encoder_Decoder_db = mxGetPr(prhs[0]);
    mxGetString(prhs[1], Path_Str_ch, bufferlength); 
    Encoder_Decoder = (short) *Encoder_Decoder_db;
    Path_Str = Path_Str + Path_Str_ch;
    mexPrintf("\nBegin of Test-Zhao Wang 6.2.2011\n");
    mexPrintf("%d, %s\n", Encoder_Decoder, Path_Str_ch);
    mexPrintf("End of Test-Zhao Wang 6.2.2011\n");
}


附录2 mexFunction.h

#include "matrix.h"
#include "mex.h"
#define TEST_MATLAB_3_EXPORTS
#ifdef TEST_MATLAB_3_EXPORTS
#define MEX_FUNCTION_API __declspec(dllexport)
#else
#define MEX_FUNCTION_API __declspec(dllimport)
#endif
MEX_FUNCTION_API void mexFunction(int nlhs, mxArray* plhs[],int nrhs, mxArray* prhs[]);


附录3 mexFunction.def

LIBRARY    "test_matlab_3"
EXPORTS
        mexFunction

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多