Vc调用Matlab7说明
一、Matlab7安装配置
1. 安装(略),但需要保证电脑上 matlab与vs2008
2. 运行mex –setup(选择或改变编译配置,不配置可能会引起不能编译dll或者编译的dll 不能被vc调用)
1) 系统提示:Would you like mex to locate installed compilers [y]/n?
选择 y 回车
2) 出现结果可能如下:
Select a compiler:
[1] Lcc-win32 C 2.4.1 in F:\Tools\DevTools\MATLAB\R2009b\sys\lcc
[0] None
如果需要选择vc编译器(一般情况下)需要选择N,选择N后出现结果如下:
Select a compiler:
[1] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
[2] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1linker)
[3] Microsoft Visual C++ 2005 SP1
[4] Microsoft Visual C++ 2008 Express
[5] Microsoft Visual C++ 2008 SP1
选择 5
3) 系统可能提示如下:
The default location for Microsoft VisualC++ 2008 SP1 compilers is C:\Program Files (x86)\Microsoft Visual Studio 9.0,
but that directory does not exist on thismachine.
Use C:\Program Files (x86)\Microsoft VisualStudio 9.0 anyway [y]/n?
路径正确时可以直接选Y,路径错误时选N,重新设置vc2008安装路径
4) 成功安装后出现可能提示:
Use C:\Program Files (x86)\Microsoft Visual Studio 9.0 anyway [y]/n?n
Please enter the location of your compiler: [C:\Program Files(x86)\Microsoft Visual Studio 9.0] D:\Program Files (x86)\Microsoft VisualStudio 9.0
Please verify your choices:
Compiler: Microsoft Visual C++ 2008 SP1
Location: D:\Program Files (x86)\Microsoft Visual Studio 9.0
3. 运行 mbuild –setup(配置基本同上)
二、Vc配置
如果配置一切正常,包含文件目录与库文件目录会自动设置,如果没有自动设置,需要手动设置一下。
1. 设置包含文件
设置vc++目录中的包含文件路径,在最下方添加实际的matlab的include路径
2. 设置库文件目录
三、Matlab生成dll
1. 使用matlab生成一个.m文件
2. 在matlab环境中调用该函数
现在我们得出的结果是 5
3. 运行 mcc -t-h-L C-W lib: ppp-T link: lib myfunct.m
MATLAB会提示 -t -h -L 这三个参数已经不再使用了,不管它,工作目录中会生成一堆文件,其中的ppp.h ppp.lib ppp.dll三个文件是我们所需要的。这个过程可能会持续一会,只要不报错,你多等一会,最多一分钟,在目录中会生成所需要的文件。
也可以直接使用
mcc -Wlib:gpsanarmxl -T link:lib gpsana.m
这样的命令行进行编译生成dll
其中ppp可以指定为其他的名字
四、Vc调用dll
1. 使用vc创建一个控制台程序
2. 在main函数中输入以下代码
int _tmain(int argc, _TCHAR* argv[]) { // 初始化环境 bool bl = pppInitialize();
// 参数定义 double a[1] = {1.0}; double b[1] = {2.0}; double ret;
// 因为matlab所需要的参数都是矩阵,故应如下方式定义 mxArray *G = mxCreateDoubleMatrix(1, 1, mxREAL); // 输入矩阵,× mxArray *y = mxCreateDoubleMatrix(1, 1, mxREAL); // 调用MATLAB函数,参数都必须是矩阵形式 mxArray *R = mxCreateDoubleMatrix(1, 1, mxREAL); // 调用MATLAB函数,参数都必须是矩阵形式
// 将数据拷贝到matlab定义的变量中 memcpy((void *)mxGetPr(G), (void *)a, sizeof(a)); // 拷贝数据 memcpy((void *)mxGetPr(y), (void *)b, sizeof(b)); // 拷贝数据
// 调用函数 mlfMyfunct(1, &R, G, y);
// 从matlab返回值中获得函数返回值 double * md = mxGetPr(R); // 取得mxArray中的数据 double result = md[0]; // 数组第一个元素就是我们想要的值
// 打印返回值 printf("%f", result);
// 将matlab申请的变量释放掉 mxDestroyArray(G); // 释放内存 mxDestroyArray(y);
pppTerminate(); // 结束调用
char c; scanf("%c",&c);
return 0; } |
注意:需要将lib文件添加到工程中。
3. 编译运行后,会输出结果 3。如果我们将 参数改为2,3,将会输出5,与matlab中输出的结果是相同的。
结果如下: