
版权声明:本文为博主原创文章,未经博主允许不得转载。
Matlab 作为当今世界上应用最为广泛的数学软件, 具有非常强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算的功能。已经在如生物工程,图像处理,语音处理,雷达探空,声纳探水,地震探地,以及控制论,系统论等各个领域得到广泛的应用。它是一个完整的数学平台,在这个平台上,用户只需寥寥数语就可以完成十分复杂的功能,大大提高了工程分析计算、图像处理的效率。但是Matlab 强大的功能只能在它所提供的平台上才能使用,即用户必须在安装Matlab 系统的机器上才能执行*.m 文件。这样当用户需要将在Matlab 下已开发完毕的复杂算法应用到高级语言开发环境下时就带来了问题,是将现成的东西集成高级语言开发的程序中呢?还是用高级语言再重新实现一遍?显然大家所期望的是减少工作量, 最好能将Matlab下开发好的程序或函数直接应用到高级语言开发的程序中,这就是Matlab与高级语言的混合编程问题。
VC++是当前Windows 下的主要编程语言之一,它能方便地形成应用软件中所需要的各种用户界面和工具并直接与系统及底层硬件交换数据。用VC++开发的系统具有容易维护升级、界面友好、代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中广泛采用的主要工具之一。因此,如何将Matlab与VC++进行有效的混合编程广受工程科研人员的关注。解决这个问题,不仅能更好地发挥Matlab 强大的功能,还能快速地进行软件开发,尤其是当软件开发中需要实现复杂的数学算法、图形处理时尤为迫切。研究VC++与Matlab的混合编程具有很大的实际意义。
MATLAB 与Visual C++结合的方法有多种,但其实用程度与范围不同。目前主要有以下三种方式。
1. 通过Matlab引擎(Engine)
采用客户机/服务器(Client/Service)的计算模式,通过windows的ActiveX通道和MATLAB进行结合。MATLAB引擎采用客户机和服务器计算方式,提供了一组Matlab API函数,用户不必关心Matlab引擎是如何实现的,只要调用这些函数即可。正是通过这些API函数实现应用程序进程之间的传递函数,从而实现Matlab与VC的混合编程。具体应用中,往往在VC中设计程序框架, VC的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,通过调用MATLAB引擎在后台与MATLAB服务器建立连接,实现动态通信。这种处理方法不要求链接整个Matlab,只需嵌入必要的Matlab引擎库,节省了大量的系统资源,使应用程序整体性能更好,处理效率更高,但这种混合编程的方法需要MATLAB在后台适时运行不能脱离Matlab环境,否则影响了程序的通用性,因此这种方法在实际开发过程中很少采用。
2. 通过DLL实现混合编程
DLL是动态链接库的英文缩写,是一个可执行的二进制文件。把很多通用的功能放在DLL 中,可供多个应用程序调用,而不是每个应用程序在连接时都要增加一个库中目标代码的拷贝。通过Matlab自带的Compiler编译器,可以把由Matlab编写的m 函数文件编译成动态链接库(dl1)。或者通过Matlab提供的组件功能,运用VC+十向导自动生成m文件的动态链接库。在VC程序中调用封装的函数,实现数值算法的运用。这种方法只需在开发和发布中包含其生成的动态库就可以了,可以使程序脱离Matlab可以整体减少文件外部存储空间的占有量,并实现了代码共享。
3.使用COM技术实现混合编程
COM技术是一种应用广泛、方便灵活的方法,是利用MATLAB提供的Deploy Tool工具实现MATLAB与C/C++的混合编程。COM给软件开发人员提供了一种共享二进制代码的方法,这种共享并不局限于某种编程语言。
VC与Matlab混合编程(在VC中调用DLL)的实现
本人所用系统为windows7旗舰版,MATLAB为R2008a和Microsoft Visual C++6.0编程环境。
一、 MATLAB编译环境的设置
为了能够使用MATLAB的Complier将*.m函数文件编译为动态链接库DLL,必须对MATLAB的环境做出相应的设置。具体做法如下:
在MATLAB的Command Window下输入命令 mbuild –setup,并根据MATLAB的提示选择合适的编译器,笔者使用的是Microsoft Visual C++6.0,进行对C++连接环境的设置。过程如下:
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:/PROGRA~1/MATLAB/R2008a/sys/lcc
[2] Microsoft Visual C++ 2005 in d:/Program Files/Microsoft Visual Studio 8
[3] Microsoft Visual C++ 6.0 in D:/Program Files/Microsoft Visual Studio
[0] None
Compiler: 3
Please verify your choices:
Compiler: Microsoft Visual C++ 6.0
Location: D:/Program Files/Microsoft Visual Studio
Are these correct [y]/n? y
Trying to update options file:
C:/Documents and Settings/hk/Application Data/MathWorks/MATLAB/R2008a
/compopts.bat
From template: D:/PROGRA~1/MATLAB/R2008a/bin/win32/mbuildopts/msvc60compp.bat
Done . . .
在MATLAB的Command Window下输入命令 mex –setup,进行对编译环境的设置。过程如下:
>> mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:/PROGRA~1/MATLAB/R2008a/sys/lcc/bin
[2] Microsoft Visual C++ 2005 in d:/Program Files/Microsoft Visual Studio 8
[3] Microsoft Visual C++ 6.0 in D:/Program Files/Microsoft Visual Studio
[0] None
Compiler: 3
Please verify your choices:
Compiler: Microsoft Visual C++ 6.0
Location: D:/Program Files/Microsoft Visual Studio
Are these correct [y]/n? y
Trying to update options file: C:/Documents and Settings/hk/Application Data/MathWorks/MATLAB/R2008a/mexopts.bat
From template: D:/PROGRA~1/MATLAB/R2008a/bin/win32/mexopts/msvc60opts.bat
Done . . .
*********************************************************************
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www.mathworks.com/support/solutions/data/1-5C27B9.html?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.
*********************************************************************
二、创建动态链接DLL
这里我们用的方法就是使用MATLAB的mcc命令将*.m文件编译为动态链接库(*.dll)。
关于mcc有很多参数可以使用,而且有多种用法,具体的可以参见MATLAB的帮助。
其中MATLAB提供了三种使用MATLAB编译器的方式:
(1) 在MATLAB环境中使用mcc命令;
(2) 在系统命令环境中使用mcc.exe(在Windows上);
(3) 在MATLAB环境中使用Deployment Tool.
前两种方式所需要的命令行参数是一样的。
假设要把file1.m和file2.m编译成可执行文件:
mcc –m file1 file2
假设要把file1.m和file2.m编译成C语言动态链接库文件:
mcc –w lib:mylib –T link:lib file1.m file2.m
假设要把file1.m和file2.m编译成C++语言动态链接库文件:
mcc –w cpplib:mycpplib –T link file1.m file2.m
三、使用MATLAB编译器和VC6.0实现混合编程(通过例子说明)
1、MATLAB中的操作
(1)创建mccdemol.m文件,内容如下:
(2) 在MATLAB命令行下,将mccdemol.m编译成C++动态链接库文件。可以执行如下命令:(带图形的和不带图形的有区别,这里主要是带图形的编译)
>> mcc -W cpplib:libmccdemol -T link:lib mccdemol.m
命令执行完成后,将在工作目录产生使用MATLAB编译生成库文件所需的相关文件。
2、建立VC对话框工程
创建一个基于MFC对话框的工程,工程名称为MccDemol,如下图所示:
设计对话框界面如图:
在文件MccDemolDlg.cpp : implementation file中包含头文件,如下所示:
#include "libmccdemol.h"
修改对话框的初始函数如下:
BOOL CMccDemolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
bool res = false;
res = mclInitializeApplication(NULL,0);
if (!res)
{
MessageBox("初始化Application错误!");
}
res = libmccdemolInitialize();
if (!res)
{
MessageBox("初始化Lib错误!");
}
return TRUE; // return TRUE unless you set the focus to a control
}
为对话框添加WM_DESTROY消息,使用快捷键“Ctrl+W”,调出MFC Class Wizard对画框,如下图所示:
添加如下消息响应函数:
void CMccDemolDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
bool res;
res = mclTerminateApplication();
if (!res)
{
MessageBox("结束程序错误!");
}
libmccdemolTerminate();
}
为确定按钮添加消息响应函数
void CMccDemolDlg::OnButtonRun()
{
// TODO: Add your control notification handler code here
mccdemol();
mclWaitForFiguresToDie(NULL);
}
本例中用到了MATLAB图形功能,所示使函数“mclWaitForFiguresToDie(NULL)”,在没有用到MATLAB的图形功能的库文件时,不需要此函数。
3、VC中的设置
将在MATLAB环境下编译后的生成文件“libmccdemol.h”、“libmccdemol.dll”、“libmccdemol.lib”和“libmccdemol.ctf”(这个文件在有的编译器下生成后瞬间消失,如本例中,所以建议如果生成有的话,就将其添加,如没有就不用了。CTF文件见后面注释)复制到当前工程目录。
为工程添加库文件“libmccdemol.lib”和“mclmcrrt.lib”,如下图所示。
编译运行工程,可以看到运行结果,单击确定按钮,弹出Figure窗口。这与MATLAB环境下直接运行的结果相同。
-
顶
- 0
-
踩
- 0
我的同类文章
参考知识库
- VC++游戏开发基础系列从入门到精通
- Visual Studio 2015开发C++程序的基本使用
- Swift与Objective-C\C\C++混合编程
- C++语言基础
-
征服JavaScript高级程序设计与应用实例视频课程
- DLL文件 VC++&Matlab混合编程 调用DLL
- VC与Matlab混合编程在VC中调用m文件编译生成的DLL
- VC++和Matlab混合编程在VC中调用将m文件生成的DLL
- VC与Matlab混合编程在VC中调用DLL
- VC与Matlab混合编程在VC中调用DLL
19楼 d62906 2016-03-22 16:02发表 [回复] [引用] [举报]-
-
按照你的步骤做了一遍,提示“cannot open file "mclmcrrt.lib"。把“mclmcrrt.lib”的路径加进去之后也不管用啊
18楼 AgentNeo 2014-10-22 22:01发表 [回复] [引用] [举报]-
-
初始化Application错误!
Re: AgentNeo 2014-10-24 16:05发表 [回复] [引用] [举报]-
-
回复wajh07:ctf文件缺失 加-C 编译
17楼 youmidaxia 2014-05-28 12:40发表 [回复] [引用] [举报]-
-
楼主,你的问题解决了吗?现在我用matlab工具箱里的函数做成自己的函数,然后编译成dll格式,在VC++里调用,发现出错了,是不是工具箱里的函数在VC++里不能调用啊!因为我发现不是工具箱里的函数,是可以再VC里调用的,而且也成功了。那么工具箱里的函数是不能调用,我说的对吗?求指导。联系方式:扣扣306486933 。希望可以跟大神好好交流一下。
16楼 tianyongtao 2014-03-21 16:25发表 [回复] [引用] [举报]-
-
出现以下错误:
error C2065: 'mclInitializeComponentInstance' : undeclared identifier
这是什么原因?
备注:我用的是matlab 7.0.4 和vc 6.0
Re: youmidaxia 2014-05-28 12:39发表 [回复] [引用] [举报]-
-
回复tianyongtao:楼主,你的问题解决了吗?现在我用matlab工具箱里的函数做成自己的函数,然后编译成dll格式,在VC++里调用,发现出错了,是不是工具箱(robot工具箱)里的函数在VC++里不能调用啊!因为我发现不是工具箱里的函数,是可以再VC里调用的,而且也成功了。那么工具箱里的函数是不能调用,我说的对吗?求指导。联系方式:扣扣306486933 。希望可以跟大神好好交流一下。
15楼 樊豆豆123 2014-03-12 19:24发表 [回复] [引用] [举报]-
-
如果是matlab2013a和visual studio 2010(C++)的混合编程就更好了
14楼 smile_3y 2013-08-22 11:03发表 [回复] [引用] [举报]-
-
你好,麻烦请问一下,我输入>> mbuile -setup提示??? Undefined command/function 'mbuile'.但是输入>> mex -setup就没有问题 跟您说的一样,这是什么问题啊?与matlab的版本有关吗?还是matlab的配置有问题???谢谢啦!!!
13楼 xuewonder 2013-04-20 20:02发表 [回复] [引用] [举报]-
-
您好,mclmcrrt.lib是什么库,我按你上面的步骤做了,但是有错误提示:Cannot open include file: 'mclmcrrt.h': No such file or directory。是什么原因啊?谢谢!
12楼 lang999888 2013-02-05 13:31发表 [回复] [引用] [举报]-
-
很好,学习一下。
11楼 jin_orchid 2012-09-07 21:05发表 [回复] [引用] [举报]-
-
学习了,谢谢
10楼 dubaolei 2012-08-27 23:28发表 [回复] [引用] [举报]-
-
学习中 现转载
9楼 buaa_yangzhongwei 2012-05-11 16:31发表 [回复] [引用] [举报]-
-
为什么我这里显示
error C2065: 'libmccdemolTerminate' : undeclared identifier
error C2065: 'libmccdemolInitialize' : undeclared identifier
error C2065: 'mccdemol' : undeclared identifier
8楼 xialin1234 2012-05-09 19:53发表 [回复] [引用] [举报]-
-
你好,非常感谢,并按照你的做法一步一步的做了一遍,编译无误,可运行时出现错误:应用程序发生异常 未知的软件异常(0x06D7363)位置为0x7c812afb。你能帮我想想是什么原因吗?万分感谢。联系方式是:QQ834546423
7楼 y527353319 2012-04-05 16:01发表 [回复] [引用] [举报]-
-
你好,我在编写好的vc++程序中在调用matlab里面的一个函数为什么在这一行就停止了?net_f=newff(minmax(mpi_f),[8,1],{'tansig','purelin'}); 求大师赐教,可以发送到我的邮箱吗?527353319@qq.com,谢谢啦!
6楼 cjiayou 2012-03-05 20:17发表 [回复] [引用] [举报]-
-
谢谢 可以用
5楼 f5538 2011-08-09 11:41发表 [回复] [引用] [举报]-
-
非常感谢!我也实现了上述过程。
不过事前得在VC6中设置一下,包含相关的头文件和相关的库文件
4楼 jollyjw1234 2011-06-27 22:09发表 [回复] [引用] [举报]-
-
你好,我怀着学习的态度仔细的阅读了你的文章,并按照你的做法一步一步的做了一遍,我的编译环境是Matlab2007a,VC++6.0,结果是编译无误,可是等到最后运行的时候却提示是“初始化Lib错误”!我百思不得其解,您能帮我想想这是什么原因吗?
我的联系方式是:QQ:1102877309
3楼 scn6767 2011-02-25 15:16发表 [回复] [引用] [举报]-
-
为什么没有图啊 。scn6767@163.com
能给我传份有图的完整的吗?
救急啊!谢谢[e01]
2楼 scn6767 2011-02-25 15:16发表 [回复] [引用] [举报]-
-
为什么没有图啊 。scn6767@163.com
能给我传份有图的完整的吗?
救急啊!谢谢
Re: hahalxp 2011-03-10 14:25发表 [回复] [引用] [举报]-
-
回复 scn6767:我已经重新把图加上了
Re: scn6767 2011-04-05 15:02发表 [回复] [引用] [举报]-
-
回复 hahalxp:谢了。顶你[e01]
1楼 lixiaopeng519 2010-04-20 09:51发表 [回复] [引用] [举报]-
-
[e01]