文章转自:http://blog.csdn.net/qq245034548/article/details/26284213
我最近在研究VC++ 6.0和MATLAB7.0两种编译工具的混合编程,也在网上查询了好多关于这方面的知识。其中利用com接口实现两者的混编相对比较简单,下面我给大家演示一个实例:
编译环境 win7 + MATLAB7.0 + vc++ 6.0。
(1).在matlab7.0里面运行 mbuild -setup 结果如下图:
输入y,结果如下图:
选择Microsoft Visual C/C++ version 6.0,即输入2,结果如下图:
接下来是确认路径,输入y,结果如下图:
到此就完成了mex -setup语句的操作。
(2).在matlab7.0里面运行 mbuild -setup 结果如下图:
因为运行步骤和(1)里面的一模一样,我就在这里给大家截图了,如下:
错误1:大家有的电脑可能在运行 mex -setup 或者 mbuild -setup 时在选择选项时没有vc++ 6.0这个选项,根据小编的经验,主要是路径的问题,只需要将vc++ 6.0安装在C盘就可以在matlab里面获取到路径了。
(3).编译函数:在matlab里面写一个 **.m 文件,如下图:
接着编写函数代码:
function y = test(temp)
x=0:1:100;
y=poisspdf(x,temp);
plot(y);
命名为 test ,编译保存。如下图:
然后利用mcc语句生成dll文件,操作语句为:
mcc -W cpplib:testlib -T link:lib test
其中testlib是你要生成dll的文件名,test是你 **.m函数的文件名。
结果如下图:
这样就在我们matlab的文件目录里生成了相应了一大堆文件,而我们需要的就是 .ctf .dll .h .lib 4个文件。
如下图:
做到这里就已经完成了matlab这边的操作。现在我们转去vc那边啦~~
(4).用vc++ 6.0建立一个工程,无论是mfc还是Win32控制台程序都行,小编就在这里建立一个mfc对话框程序吧。过程就不说了,顺便再为对话框添加一个按钮相应函数,如下图:
(5).将(3)里面生成的4个文件复制到我们建立的工程目录下,我建立的目录名为test11,如下图:
(6).与matlab路径的互连操作:
a.设置Include 和Library 目录:
选择Tools->Options->Directories,
在Show directoris for:中选择Include files,
添加<Matlab安装路径>\extern\include 目录。如下图:
在Show directoris for:中选择Library files,
添加<Matlab安装路径>\extern\lib\win32\microsof\msvc60. 如下图:
b.在FileView的Header Files里面加入testlib.h文件,如下图:
c.进入project>Settings, 选择“link”选项卡,Category选择General,在下面的Object/library modules 那栏的最后添加:
(7).添加编译代码:
首先在Dlg.cpp文件里面添加头文件 #include "testlib.h"
因为建立的工程是对话框文件,所以在Matlab_test按钮的消息相应函数里添加如下代码:
if( !mclInitializeApplication(NULL,0) )
{
AfxMessageBox("Could not initialize the application!" );
}
// initialize lib
if( !testlibInitialize())
{
AfxMessageBox("Could not initialize testlib!");
}
mwArray a(1, 1, mxDOUBLE_CLASS);
mwArray b(1, 1, mxDOUBLE_CLASS);
double *x, y = 10;
x = &y;
a.SetData(x, 1);
test(1, b, a);
testlibTerminate();
mclTerminateApplication();
如下图:
之后运行程序:点击Matlab_test按钮,运行结果如下: