Matlab2012生成DLL文件与VS2005(VC)混合编程解决方法(折腾两天的成果)
Matlab的版本太多,使用起来很麻烦,我使用过maltab2010b.2007b.都没有成功,最后装了matlab2012才成功,不知道是不是我操作的问题。本人没有使用过matlab.以下是实现的过程。
参考http://forum.simwe.com/thread-801187-1-1.html
先建立一个简单的m文件:
function mcctest01
x=0:0.01:20;
y = x.*sin(x);
plot(x,y);
xlabel('x');
ylabel('y');
需要注意文件名,在vc中需要调用。
下一步,在MATLAB中进行编译设置,键入"mex -setup”,选择VC2005。
继续输入"mbuild -setup",和上面一样仍然选择VC2005。两步选择一样。
下一步,将m文件转换为可被VC调用的dll文件。在matlab中输入命令:
mcc -t -h -L C -W lib:libmcctest01 -T link:lib mcctest01.m
MATLAB会提示 -t -h -L 这三个参数已经不再使用了,不管它,工作目录中会生成一堆文件,其中的libmcctest01.h libmcctest01.lib libmcctest01.dll三个文件是我们所需要的。
下一步,在VC2005中添加配合MATLAB编程的lib目录和include目录。
在 " \Tools \ Options \ Projects and Solutions \ VC++ Directories" 中,在 " Include files " 和 " Library files " 中分别添加下列目录(默认安装位置):
" F:\Program Files\MATLAB\R2012a\extern\include "
"F:\Program Files\MATLAB\R2012a\extern\lib\win32\microsoft "
下一步,使用VC2005新建基于对话框的工程(mfcmcctest01),在 " \Project \ Properties \ Configuration Properties \ Linker \ Input " 中添加mclmcrrt.lib、libmcctest01.lib。将上述三个文件拷贝到VC工程所在目录,在Project菜单中Add Existing Item把mccmfc01.h添加到工程中。
下一步,编程。在恰当的位置添加 #include mccmfc01.h"。在mccmfc01.h中可以看到上面m文件中那个函数的C语言声明:
externLIB_libmcctest01_C_API
boolMW_CALL_CONVmlxMcctest01(intnlhs, mxArray *plhs[], intnrhs, mxArray *prhs[]);
在mccmfc01Dlg.cpp文件的OnInitDialog()加入MCR初始化函数mclInitializeApplication(NULL, 0)、与静态库初始化函数libmcctest01Initialize()。
BOOLCmccmfc01Dlg::OnInitDialog()
{
// TODO: Add extra initialization here
if (!mclInitializeApplication(NULL, 0))
{
AfxMessageBox(_T("Cloudnot...."));
}
libmcctest01Initialize(); // 初始化
returnTRUE; // return TRUE unless you set the focus to a control
}
在按键响应函数OnBnClickedButton1()添加m文件中定义的函数mlfMcctest01();,注意是mlfMcctest01(),而不是mcctest01()。这个地方让我吃了很多哑巴亏,浪费了很多时间。
voidCmccmfc01Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
mlfMcctest01();
}
编译完,运行即可。