折腾了一天,终于把程序写完,实现了matlab和vs2008的联合编程(算法程序时以前就用C写好了的,所以并没有花很多时间写算法),现在把过程记下来,以便借鉴。
1、安装matlab和vs2008
安装完后,很有可能在matlab中输入命令mex -setup不会出现vs2008编译器选项,其中的设置细节可以参见我很早以前的一篇博文:http://blog.sina.com.cn/s/blog_4d1865f00100hz9e.html
2、在vs2008中编写的主函数必须是mexFunction(),相当于普通C程序的main()函数,他的几个参数的格式也是必须按固定的格式
下面是我用的一个简单示例XXX.pp,分别说明浮点型、字符串型的参数传递。需要注意Path_Str, Path_Str.c_str()的输出,不要像我一样被表面现象欺骗了。
#include "mex.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[4])*mxGetN(prhs[4])+1;
char *Path_Str_ch = new char[bufferlength];
short Encoder_Decoder; // 0: encoder, 1: decoder
Encoder_Decoder_db = mxGetPr(prhs[0]);
mxGetString(prhs[4], Path_Str_ch, bufferlength);
Encoder_Decoder = (short) *Encoder_Decoder_db;
Path_Str = Path_Str + Path_Str_ch;
mexPrintf("%d, %s, %s, %s", Encoder_Decoder, Path_Str_ch, Path_Str, Path_Str.c_str());
}
->mex -v XXXX.cpp
输入:XXX(1,'E:\paper')
输出:1,'E:\paper',@#,'E:\paper'
注意,当有多个源文件时,例如XXX.cpp调用了一个类(YYY.cpp和YYY.h),正确编译为
-> mex -v XXX.cpp YYY.cpp
(PS:所有源文件都必须被编译,但h文件不用编译)
3. 程序写完了,加入相应的库函数即可
![[转载]matlab与vs2008联合编程 [转载]matlab与vs2008联合编程](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![[转载]matlab与vs2008联合编程 [转载]matlab与vs2008联合编程](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
4.为了在vs环境中编译mex,除了按步骤3设置路径外,还需做一些工作。
1)新建一个wind32 application,工程名为XXX(同前cpp文件),选择DLL和Empty project类型
2)将XXX.cpp文件加入该project
3)新建一个XXX.def文件,并保存在该project中
XXX.def的内容为
LIBRARY XXX.DLL
EXPORTS
mexFunction
4)在preprocessor中加入libmx.lib,libmex.lib,libmat.lib即可
![[转载]matlab与vs2008联合编程 [转载]matlab与vs2008联合编程](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)