众所周知,MATLAB是一套功能非常强大的商业数学软件,从信号处理,语音处理,数据采集,数值运算,图像处理,到电子仿真,金融分析等等,几乎在各个工业领域,他都已经得到了广泛应用,同时也取得了巨大的成功。
但是,由于Matlab是用一种脚本语言,他的解释是逐行执行的,程序中所有的变量都是用MxArray来实现的,所以为了保证通用性,它的执行效率非常低,这就是我们常常看到的:在开发一些复杂的算法时,通常会发现程序执行得特别慢,虽然Mathworks公司已经在竭力提高m脚本文件(script files)的运算速度,但目前为止效果仍然不能和实现同样功能的可执行程序相比。而且m脚本文件是不能脱离Matlab这个应用程序环境,这就大大制约了程序的可移植性和通用性。
本文的目的正是基于上述考虑,介绍如何利用matlab提供的C/C++编译器,将m文件编译成可执行的应用程序。编译环境是:MS VC++ 6.0和Matlab6.5。
一、 MATLAB中的操作
1.没有使用图形相关的函数
由于MATLAB的编译器只能对函数m文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。举例如下:
建立一个m文件test1.m,内容如下:
function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
用如下命令对其进行编译:
mcc –t –L CPP –h test1.m
(如果程序由多个m文件组成,在编译命令中只需要指定主文件即可,mcc会自动查找相应的m文件进行编译)编译完成后会得到与m文件名相对应hpp和cpp文件,本例中是test1.hpp和test1.cpp。
2. 使用了图形相关的函数
建立一个m文件test2.m,内容如下:
function test2
plot(rand(10));
用如下命令编译:
mcc –p –B sglcpp test2.m
(如果程序由多个文件组成,处理方法同上)
编译完成后得到与m文件名相对应的hpp和cpp文件、一个主函数文件、bin目录中的两个Fig文件以及一个exe文件。我们需要的只是与m文件相对应的hpp文件、cpp文件以及bin目录中的两个fig文件,本例中是test2.hpp,test2.cpp以及bin目录中的FigureMenuBar.fig和FigureToolBar.fig。
二、VC中的操作
相比MATLAB中的操作,VC中需要设置众多的编译选项,显得比较复杂。另外,VC中可选的工程类型比较多,本文将说明MATLAB编译得到的源程序在如下工程类型中的使用
l MFC Appwizard(exe) (Dialog Based)
l Win32 Console Application
l Win32 Application
其实在这几种类型的工程中大部分的操作都是相同的,本文先描述相同的操作,再说明不同的部分。
1.用VC建立相应类型的工程,把第一步中提到的源程序拷贝到工程所在目录中。
2.选择菜单Tools-Options-在属性页中选择Directories-下拉框中选择Include Files,在其最后加入
%MATLAB6P5%\EXTERN\INCLUDE\CPP
%MATLAB6P5%\EXTERN\INCLUDE
其中%MATLAB6P5%为MATLAB的安装路径,如下图所示:
再在下拉框中选择Library Files,在最后加入
%MATLAB6P5%\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
%MATLAB6P5%\EXTERN\LIB\WIN32
如下图所示:
3.选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/library modules文本框中加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib
注意下面的Ignore Libraries文本框,这里需要根据不同的工程类型进行填写,稍后再分情况说明。如下图所示:
4.选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessor definitions中加入MSVC,IBMPC,MSWIND如下图所示:
再在下拉框中选择Precomplied Headers,选中Automatic use of precompiled headers,在其中填入stdafx.h,如下图
5.选择菜单Project-Add To Project-Files把所有拷贝过来的cpp文件加入到当前工程中。
下面再依各种不同类型的工程具体说明
1. MFC Appwizard(exe) (Dialog Based)
(仅以带图形函数的为例,所以需要把test2.hpp和test2.cpp以及两个fig文件拷贝到当前工程中)在主对话框上添加一个Button,并添加按钮的相应函数OnButton1。
在按钮响应函数所在文件中添加如下代码:
#include "test2.hpp"
在按钮相应函数中添加如下代码:
test2();
在对话框类的OnInitDialog函数中添加如下代码:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
在对话框的消息WM_DESTROY的处理函数OnDestroy()中加入如下代码:
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
在上面提到的Ignore Libraries里加入msvcrt.lib,此时即可以编译成功了。
2. Win32 Console Application
这里建立了一个支持MFC的程序,以不带图形的函数为例,把test1.hpp和test1.cpp拷贝到当前工程中,
在#include "stdafx.h"下面加入
#include "matlab.hpp"
#include "test1.hpp"
// TODO: code your application's behavior here.下面加入如下代码:
mwArray y,n;
n = 3;
y = test1(n);
double *py = mxGetPr(y.GetData());
printf("%f\n",*py);
在上面提到的Ignore Libraries里加入msvcrt.lib,由于MATLAB的库函数与VC的输入输出函数cout、cin、cerr冲突,所以需要把MFC生成的代码中
cerr << _T("Fatal Error: MFC initialization failed") << endl;一行删掉,并且在以后的代码中页不能有cout、cin、cerr。
Win32 Application
选择建立"A simple Win32 Application",这样的工程中默认是没有主窗口的,只有一个WinMain函数,以带图形的函数为例,把test2.hpp test2.cpp以及
FigureMenuBar.fig和FigureToolBar.fig拷贝到当前工程中。
在#include "stdafx.h"下面添加
#include "test2.hpp"
在WinMain函数中添加如下代码:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
test2();
mlfHGWaitForFiguresToDie();
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
此时编译能够成功,但会出现两个警告信息,在Ignore Libraries里加入msvcrt.lib,libcd.lib即可去除该信息。
三、程序的发布
由于程序中调用了MATLAB数学函数库或图形库中的函数,所以需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行。幸好MATLAB已经把这两个库的函数打包了,这样就省得我们一个一个去搜集了。该文件就是位于matlab安装目录中extern\lib\win32子目录中的mglarchive.exe。运行该程序即可自动把需要的库函数解压到当前目录中,把编译好的程序放到该目录中拷贝到未装matlab的机器上即可实现脱离matlab。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhuchzhi/archive/2007/05/29/1629618.aspx
发表评论
-
Windows消息机制要点
2011-02-13 17:13 7371. 窗口过程 每个窗口 ... -
Windows的消息机制
2011-02-13 11:33 1687Windows是一个消息(Messag ... -
许多VC++/MFC构架的开源项目
2011-02-09 16:14 1128... -
最好的53个 VC++ /MFC 开源软件项目
2010-12-14 17:51 1555http://www.codeproject.com/KB/c ... -
VC++中使用MATLAB的C++数学库和MCC生成的程序(转)
2010-10-19 23:31 1636引言 Visual C++ 是由 Mic ... -
VC中如何调用DLL中的函数
2010-10-18 15:03 1097调用DLL有两种方法:静态调用和动态调用. (一).静态调用其 ... -
dll #pragma data_seg 实现数据的共享
2010-10-18 00:52 1448#pragma data_seg("flag_dat ... -
(zz)Vs 2008 解决方案的目录结构设置和管理
2010-10-13 19:20 1225解决方案与项目: 从V ... -
(zz)MFC 入门必读
2010-10-13 13:00 4253以下是很多VC爱好者的 ... -
(zz) VC项目配置基础
2010-10-13 12:48 1366一.预处理宏 1. 通用宏 VC6.0中: ... -
(zz)VS2008在win7下不时出现Microsoft Incremental Linker已停止工作
2010-10-06 21:48 2405/INCREMENTAL 选项控制链接器如何处理增量链接。 ... -
error LNK2001: unresolved external symbol VC++链接错误详解
2010-10-04 03:40 5877学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌 ... -
error LNK2001: unresolved external symbol _main解决办法(zz)
2010-09-27 04:52 882error LNK2001: unresolved exter ...
相关推荐
标题中的“基于MATLAB与VC混合编程的数字均衡器的设计源码”指的是使用MATLAB和Microsoft Visual C++(VC)进行联合开发的一种数字信号处理工具——数字均衡器。这种技术结合了MATLAB的强大数学计算能力和VC的高效...
MATLAB与VC混合编程是一种将MATLAB的数值计算和数据处理能力与VC++的系统级编程和用户界面设计相结合的技术。这种技术允许开发者利用MATLAB的强大功能,同时借助VC++来构建更高效、用户友好的应用程序。以下是关于...
本主题聚焦于“MATLAB与VC混合编程”,这是一个非常实用的技术,尤其对于那些既熟悉MATLAB又精通VC(Visual C++)的开发者而言。MATLAB以其强大的数值计算和科学数据分析能力著称,而VC则是Microsoft提供的一个强大...
### MATLAB与VC混合编程知识点详解 #### 一、概述 MATLAB作为一种强大的数值计算软件,因其易用性和高效性在科学研究、工程计算等领域被广泛使用。然而,由于其执行效率的局限性,对于大规模数据处理或者对性能要求...