7). 然后打开project
-> test_matlab_3 properties -> C++
-> Code Generation -> Runtime
Library,选择 Multi-threaded Debug (/MTd)。
8). 然后打开project -> test_matlab_3 properties
-> Linker -> Input ->
Additional Dependencies中添加
libmx.lib,libmat.lib,libmex.lib,libeng.lib。
9).
然后打开project -> test_matlab_3 properties
-> Linker -> Input ->
Module Definition File中添加 .\mexFunction.def。
10).
然后打开project -> add new item,添加Module-Definition File
文件名为mexFunction.def。文件代码后附。
11).
然后打开project -> add new item,添加Header File
文件名为mexFunction.h。文件代码后附。
12).
编译,链接,生成test_matlab_3.dll文件,也就是我们想要的mex文件。
13).
将生成的文件拷贝到matlab目录下,执行"test_matlab_3(1,'Panpan Hu')",返回如下结果
注意:本质上来讲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