作为MATLAB的初学者,我最近在看如何实现MATLAB与VC的混合编程,查了不少资料,也借鉴了网上很多的宝贵经验和建议,现我把这份集合大家集体智慧的过程写下来,供大家参考,以希望能和高手多多交流。
软件版本:MATLAB 7.0 VC 6.0
1. 进行MATLAB C/C++编译器的设置
>>mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
Select a compiler:
[1] Lcc C version 2.4 in D:/MATLAB7/sys/lcc
[2] Microsoft Visual C/C++ version 6.0 in C:/Program Files/Microsoft Visual Studio
[0] None
Compiler: 2
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:/Program Files/Microsoft Visual Studio
Are these correct?([y]/n): y
Try to update options file: C:/Users/peng/Application Data/MathWorks/MATLAB/R14/compopts.bat
From template:
D:/MATLAB7/BIN/WIN32/mbuildopts/msvc60compp.bat
Done . . .
--> "D:/MATLAB7/bin/win32/mwregsvr D:/MATLAB7/bin/win32/mwcomutil.dll"
DllRegisterServer in D:/MATLAB7/bin/win32/mwcomutil.dll succeeded
--> "D:/MATLAB7/bin/win32/mwregsvr D:/MATLAB7/bin/win32/mwcommgr.dll"
DllRegisterServer in D:/MATLAB7/bin/win32/mwcommgr.dll succeeded
[注意]:我之前没有设置成功是由于我的VC装在了D盘中,后来把VC重装了一遍,放在C盘就可以了
2. 编写MATLAB的*.m文件
比如:
function y =E1(x)
y=x.*x-2*x+x.*x.*x;
plot(x,y);
3. 将*.m文件编译成VC可以调用的DLL
>>mcc -W libhg:<自己定义的库文件名字,如E1DLL> -T link:lib E1(m文件的名字).m
完成上面的命令就生成了一系列文件,其中有用的是:E1DLL.lib,E1DLL.h E1DLL.dll,E1DLL.crf,将上述文件拷到当前VC的工作目录下。
4. 设置VC的环境
-
Tool->Options->directories里: include files 要添加<matlab>/EXTERN/INCLUDE <MATLAB>/EXTERN/INCLUDE/CPP;
library files要增加<MATLAB>/EXTERN/LIB/WIN32/MICROSOFT/MSVC60 。 -
project->setting->links中: object/library modules中添加mclmcrrt.lib和本工程的中的lib文件:E1DLL.lib。
-
5. 在VC中调用DLL
几个关键函数:
//初始化:
res=E1DLLInitialize();
if(!res)
{
MessageBox("初始化Lib错误!");
}//析构函数
E1DLLTerminate();
//调用计算
double x =0.4; //定义一个变量
mxArray *t; //定义输入函数
mxArray *y; //定义输出函数
y=NULL;
t=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy(mxGetPr(t),&x,sizeof(double));
mlfE1(1,&y,t);//计算的核心函数,“1”表示函数有输出,在E1DLL.h中间中,是自动生成的接口
mclWaitForFiguresToDie(NULL);//等待图形窗口关闭
mxDestroyArray(t);
mxDestroyArray(y);[注意]:不要忘了#include “E1DLL.h”
以上就是我进行的主要过程。