基于Mideva编译器的MATLAB与VC++混合编程技术
2016-04-13柴西林姜丽德
柴西林,姜丽德,冯 凯
(1.西北师范大学知行学院,甘肃 兰州730070;2. 甘肃天鉴建设集团有限公司,甘肃 兰州730000)
基于Mideva编译器的MATLAB与VC++混合编程技术
柴西林1,姜丽德2,冯 凯1
(1.西北师范大学知行学院,甘肃 兰州730070;2. 甘肃天鉴建设集团有限公司,甘肃 兰州730000)
主要研究使用MATLAB编译器实现MATLAB和VC++混合编程的方法。通过VC++直接运行Mideva编译好的MATLAB可执行文件,或者调用Mideva编译好的M文件动态链接库,或者直接使用将M文件由Mideva转换的C++代码等三种方式之一,均可实现混合编程。将以上三种方法,通过一个基于MFC的对话框程序实例,较直观地演示混合编程的实现过程。
MATLAB;VC++;Mideva编译器;混合编程
0 引言
MATLAB是当前在国内外十分流行的工程设计和系统仿真软件[1]。MATLAB具有很强的数值计算和分析能力,尤其是其功能庞大的工具箱可直接应用到很多工程领域[2]。它以函数的形式为用户提供不同领域的计算,通过调用需要的函数并赋予实际参数,用户就能解决实际问题[3]。而VC++在这方面的应用不太成熟,但是VC++具有高效、灵活等特点。在科学研究和工程实践中,将MATLAB和VC++结合起来进行混合编程,具有非常重要的意义。但是,M语言是一种解释性语言,其应用场合和执行速度都受到了限制;而VC++是一种高效率、能对硬件进行操作的高级语言。将两者的优势结合起来,无疑给编程者带来了福音,使工作效率大大提高,开发周期明显缩短。
MATLAB与Visual C++的混合编程技术方法有很多,主要有使用MATLAB引擎、使用ActiveX控件、使用MAT文件共享数据、使用Mideva工具、使用C-MEX技术和使用Matlab其他编译器等多种技术实现混合编程。通常,根据两款软件的特点,在混合编程中核心程序的开发主要由Matlab完成,而VC++可用来开发交互式很好的GUI且易于与硬件接口。
1 Mideva集成调试编辑环境
1.1 Mideva简介
Mideva是一种具有比MATLAB更强大的编辑、调试功能的集成调试编辑环境[4],通过其内核Matcom 能够将M文件转化为C语言的代码[5],并通过Visual C++将其编译成可执行程序或动态链接库[5]。近千个基本的MATLAB功能函数包含于Mideva中,在与C++的混合编程中只需做必要的设置即可,从而不再依赖MATLAB,实现了对MATLAB强大工具箱函数的调用。不足之处在于,Matcom对struct等类的支持不足,而且有些绘图尤其是三维绘图效果不是很好。因此,涉及三维绘图以及M文件太大的情况下,不适合使用。
1.2 Mideva集成调试编辑环境的配置
在MATLAB环境中可以由M文件生成exe文件,但此exe文件仍需要MCR才能运行,而利用Matcom则可以生成不再需要Matcom环境支持的exe文件[6-7]。其生成方法相当简便,直接利用Matcom菜单“File/Compile to exe…”弹出如图1所示的对话框,然后选择所需的M文件,Matcom会自动生成相应的exe文件。Mideva的此项功能是仅针对Visual C++开发的,生成dll的方法与生成exe文件的方法类似,在此过程中会同时生成相应的cpp文件。因此,如果使用Visual C++开发程序,最好直接使用上述过程中编译生成的cpp文件,而不要直接使用dll文件。编译过后在Mideva下方的输出栏,如图1所示,显示编译完成。
图1 编译为可执行程序
值得说明的是,Mideva环境下绘制图形,还可以设计GUI界面程序,与MATLAB的GUIDE相似[8]。Mideva还可以像VC++一样对M文件进行调试。
2 Mideva集成调试编辑环境的使用
Mideva安装时会提示选取C/C++编辑器,还需要指定MATLAB,以便使编译文件中的一些系统函数找到所需路径。Mideva接口方便,通过菜单File→Compile to dll可直接实现M文件到可执行文件的转换,同时会自动生成相应的C/CPP文件。为了将C/CPP代码添加到VC++的工程中,必要的设置主要有以下几步。
(1)添加头文件
在“matcom45lib”目录下,可以找到Mideva提供的函数头文件Matlib.h。具体方法是:在菜单“Tools/Options…”中,选择“Directories”选项卡,然后在“Show Directories for”中选取“Include files”,然后添加目录“matcom45lib”。如图2所示。
图2 添加头文件
(2)添加库文件
在“Show Directories for”中选取“Library files”,然后添加目录“matcom45lib”。如图3所示。需要注意的是,不同版本的Mideva文件名可能略有差异,可以修改matlib.h中Matcom_VERSION宏定义。
图3 添加库文件
以VC6.0为例,Mideva同时提供可供使用的插件,单击VC6.0菜单“Tools/Customize...”,将会弹出如图4所示对话框,然后选择“Add-ins and Macro Files”选项卡,单击浏览按钮,选择“matcom45/bin/mvcide.dll”,单击关闭,则在VC6.0集成环境中出现Visual Matcom图标,此时表明MATLAB的编译工具已与VisualC ++连接,如图5所示。
图4 添加Visual Matcom
图5 在VC下Visual Matcom工具栏
3 使用Mideva实现混合编程
3.1 混合编程实现过程流程图
运用Visual C++调用MATLAB实现混合编程,通过以下三种方式均可实现:(1)Mideva将M文件编译为可执行文件,VC通过编程执行可执行文件实现混合编程。(2)Mideva将M文件编译为动态链接库,VC在运行时调用。(3)Mideva将文件转换为C++代码,VC直接使用转换后的代码进行混合编程。将以上三种方法通过一个基于MFC的对话框程序实例,演示混合编程的实现过程,如图6所示。
3.2 基于 MFC的对话框实例程序实现混合编程的步骤
(1)创建名称为MidevaDemo1.m的M文件。在MATLAB环境下创建M文件,内容为一个简单的正弦函数。并将M文件保存在新建的工程目录下。
图6 混合编程的实现过程流程图
(2)在Mideva环境下将MidevaDemo1.m分别编译为动态链接库和可执行文件,在工程目录下产生相关的代码。由于动态链接库和可执行文件产生的“g_MidevaDemo1.cpp”不同,所以分别新建两个工程目录“DLLWORK”和“EXEWORK”。其他两个文件“MidevaDemo1.h”和“MidevaDemo1.cpp”在两个工程中内容相同。
(3)创建MFC对话框的工程,工程名称为MCCDemo。设计对话框界面如图7所示。
图7 混合编程总界面
(4)在文件“MccDemo1Dlg.cpp”中包含头文件:
include
(5)向工程添加文件V4501.lib,如图8所示。
(6)在图7所示的MFC实例混合编程运行结果总界面中,单击“执行EXE程序”按钮,则弹出如图9所示界面;单击“调用DLL代码”则弹出如图10所示界面;单击“执行源代码”则弹出如图11所示界面。
4 结论
从上述运行结果可以看出,不同的运行方式得到的图形绘制结果一致。运用VC++通过编程执行exe文件实现的混合编程,这种方式易于维护,但应用程序耦合比较松散,界面不统一。VC ++调用MATLAB数学库和经过编译的动态链接库,具有内存需求小、执行速度快、可以发布给没有MATLAB的用户使用等显著的优点。但也有几个缺点:用户不能够在基于MATLAB数学库和图形库的应用程序中使用MATLAB的 eval()和input()函数,不能调用图形句柄系统的函数,不能调用MATLAB工具箱的函数。本文仅在可行性(feasibility)层面上进行了论证,对于实质性的应用还需进一步研究和实践。
图8 向工程添加库文件
图9 运行可执行文件结果
图10 执行调用动态链接库的结果
图11 执行直接转换后的代码结果
[1] 柴西林,邵照勇.基于MatlabGUI的数字滤波器设计及其应用[J].微型机与应用,2012,31(14):3-6.
[2] 张亮,王继阳.MATLAB与C/C++混合编程[M].北京:人民邮电出版社,2008.
[3] 柴西林,朱国平,邵照勇.基于不同算法实现的数字图像水印技术及其抗攻击性比较[J].数字技术与应用,2012(3):97-98.
[4] IDEVA1 M.Matcom &Visual Matcom user’s guide V 4.5 Release [M] .MathToo1s Ltd.,1999.
[5] 苏金明,黄国.MATLAB与外部程序接口[M].北京:电子工业出版社,2008.
[6] 杨文臣,张轮,何兆成,等.Matlab 与VC++混合编程及其在交通信号两级模糊控制中的应用[J].公路交通科技,2012,29(9):123-128.
[7] 易驰,文小玲,邹艳华,等.基于VC++6.0的读表软件设计[J].微型机与应用,2014,33(5):16-19.
[8] 肖永韧,解习农,刘晓峰.VC 与MATLAB 混合编程之DL L实现方法[J].计算机工程与应用, 2001(13):174- 176.
MATLAB and VC++ mixed programming technology based on mideva compiler
Chai Xilin1, Jiang Lide2,Feng Kai1
(1.Zhixing College, Northwest Normal University,Lanzhou 730070, China;2.Gansu Tianjian Construction Group Co., Ltd.,Lanzhou 730000, China)
This article mainly studies the method of using Mideva compiler to realize the mixed programming between Matlab and VC++. There are three main ways. In first one,the M file is compiled into executable files by the Mideva compiler, and then the executable file is executed by VC++.In second one, VC++ calls dynamic link library in the run,which is compiled from the M file by the Mideva compiler.In third one, Mideva compiler converts the M file into C++ code, then VC++ uses the converted code directly. Through a process of dialog-based MFC application instance, it is intuitive to demonstrate the implementation process of mixed programming for the foregoing three ways.
MABLAB;VC++; mideva compiler;mixed programming
TP311
A
1674-7720(2016)01-0023-04
柴西林,姜丽德,冯凯.基于Mideva编译器的MATLAB与VC++混合编程技术 [J] .微型机与应用,2016,35(1):23-26
2015-09-10)
柴西林(1984-),通信作者,女,硕士,讲师,主要研究方向:信号处理与智能控制。E-mail:chai.xilin@163.com。
姜丽德(1988-),女,本科,主要研究方向:自动化仪器仪表。
冯凯(1983-),男,本科,助理实验师,主要研究方向:电子与信息工程。