数学建模社区-数学中国

标题: matlab生成exe文件(总结) [打印本页]

作者: 我能    时间: 2012-11-2 13:08
标题: matlab生成exe文件(总结)
matlab功能相当的强大,写好了m文件但是其他很多电脑没有安装matalb,不能运行,所以我们想找到生成exe的可执行文件,我么就想到了和c语言c++进行混合编程,在windows下生成exe文件,matlab和vs等的文章很少大都是那几个 ,我自己在网上找了些东西总结了下:5 c9 z* y6 v6 S  y* E
8 U# d* _, @5 K% n; G
1.Matlab环境设置
要建立独立运行的C应用程序,系统中需要安装MatlabMatlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。. \4 |- o; p* ^4 A
Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。2 |' s5 |* L! {  V% P9 R( e& X
虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行。但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。
Matlab Command Window 下输入命令
mbuild – setup
操作过程如下图:
                              
然后输入命令
mex – setup
以类似的方法配置编译器。Matlab 的配置完成。
2.VS环境设置
1)设置Include Library 目录
项目右键->属性->VC++目录->包含目录:添加
<MATLAB>\R2010b\extern\include\win64
<MATLAB>\R2010b\extern\include\
项目右键->属性->VC++目录->库目录:添加
<MATLAB>\R2010b\extern\lib\win32\microsoft
<MATLAB>\R2010b\extern\lib\win64\microsoft
截图(部分):
2)设置工程目录
项目右键->属性->C/C++->常规->附件包含目录:添加
<MATLAB>\R2010b\extern\include\win64
<MATLAB>\R2010b\extern\include\
项目右键->属性->链接器->常规:添加
<MATLAB>\R2010b\extern\lib\win32\microsoft
<MATLAB>\R2010b\extern\lib\win64\microsoft
项目右键->属性->链接器->输入->附件依赖性:添加
libeng.lib
0 ]- R; ?8 ]- {" u% E8 {" dlibmat.lib8 @5 b$ \  }3 S. E
libmex.lib) E$ r) p+ Q8 A
libmx.lib
  
注:1.lib文件包含在<MATLAB>\R2010b\extern\lib\win64\microsoft,可根据需要增减
2.附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。
截图:
项目右键->属性->链接器->高级->目标计算机:更改(只针对64WINDOWS
MachineX86 -> MachineX64
注:分析原因为MATLAB根据计算机平台选择了X64编译环境,如此处不修改会出现 错误3
3)配置管理器设置(只针对64WINDOWS
生成->配置管理器->平台:更改
Win32->X64
注:分析原因为配合链接器中目标计算机的修改,如此处不修改会出现 错误4
截图:
3.系统(Windows)环境设置
我的电脑->属性->高级系统设置->高级->环境变量->Path,添加:
<MATLAB>\R2010b\bin;<MATLAB>\R2010b\extern\lib\win64\microsoft;<MATLAB>\bin\win64
注:1.Windows7的情况下,用户变量系统
变量都需 添加,如不添加,运行时会出现 错误5
2.哈哈,别忘记重启哈,重启后生效
OK!配置就此结束,现在就开始engOpen吧!!对了,别忘记添加#include "engine.h"
! b( i( y6 L" n
  
6 m- L" v: z# j* r1.设置编译器:
; U% A$ X5 C6 E& i在确定安装好Matlab Compiler后,还需要对Compiler进行适当的配置,方法是在Matlab命令窗口输入:
6 T0 k$ j* o, _) q( o) |6 tMbuild –setup, 按提示选择matlab自带编译器LCC。
& H; a, I; e, x: L; q5 G1 r& t
" l. A: y8 W5 y' Q4 _1 B- |! _# g2.将脚本编译为可执行文件:- l6 P$ {' W* M! U* D. A: `( N7 m
如项目文件包含:gui.m, gui.gif, fun1.m。
+ [. m" G4 g- d# Q4 r
1 {, B7 [( O, P" U0 f0 x* P在此路径下命令行输入:mcc –m gui.m,生 成:mccExcludedFiles.log,ReadMe.txt,gui.ctf,gui.prj,gui_main.c,gui_mcc_component_data.c,gui.exe。其中:gui.ctf,gui.exe为脱离matlab环境运行必需的文件。" y2 ^% t: q; b' N
6 L3 E, B9 p! i3 c. ^
3.在未安装matlab的机器上运行可执行程序。
& g/ c  v; _+ X& d6 R将R22007b\toolbox\compiler\deploy\win32中的MCRinstaller.exe安装到该计算机上,将生成可执行程序脱离matlab运行所需的函数库。
2 w% P$ Q/ H. Q3 y将2中生成的gui.ctf,gui.exe拷贝到该计算机同一路径。运行gui.exe将生成gui_mcr文件夹,包含程序运行所需的库。至此完成。8 p1 g* r; F: I( w  I: u! [
* n1 P0 ]4 h- [& k" D& U1 T! j% Y
4.去除独立可执行程序运行时的“DOS黑窗口”。
$ p& `/ |& G. ], b4 ?! [# }以上生成的exe程序运行时首先弹出一个DOS界面窗口,如果不需要其输出数据和错误信息,可将其去除。
# o0 n5 N9 I( `; c, w" n* P
/ w  k$ Q+ r: y: p. vmatlba命令行输入:( C# H8 K, x- z: G

8 X9 y$ Q5 I0 ?, e0 y. gcd(prefdir)
% Z, k* v& T- {: jedit compopts.bat6 B# ~3 P4 F* B

( R* D4 Q) X3 k9 l! Z; |; B, i, X此时compopts.bat打开,在文件最后添加:! H: m3 S9 I" N
5 `  z: m" Y% ]3 ^
set LINKFLAGS=%LINKFLAGS% -subsystem windows5 i9 F7 N6 ~( i+ v$ |5 a# U7 b
9 Q/ s8 F' X- B" ?0 f# Z0 B% h: ?
如果程序比较复杂,易出现异常,则不建议去除这个dos窗口以便调试。. q) N% }$ E) w+ u4 n$ ^
3 y' a3 m( T+ O$ s3 r$ h* C
另外,这个办法是适用于你用的编译器为LCC,如果是其他的,那么所加语句有所不同
& I! d. O$ f# I+ L; M& v9 K9 y% T# m. }5 W* M
Microsoft Visual C/C++:2 O1 w. {" Z; }" m- h
+ r1 C% q3 ]& d$ b6 Y+ `
set LINKFLAGS=%LINKFLAGS% /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup# p4 p" T' b1 D4 v, z" w6 I' ?

) N8 o2 W% R- t1 ?1 Q# _. _Borland:
( s1 L" y; t. d$ Z) ]3 e. J# K, c7 X! i
set LINKFLAGS=%LINKFLAGS% -aa- D8 q. V; V( Y! G9 W. U
———————————————————————————————————————–
& ~' f6 ~3 {, D. s/ l' L& @% Z- h' U! ~8 D$ R" b
方法一:8 B7 E- S' z$ E+ z; i9 D- s% `4 G
已有gui.m文件和gui.fig文件* {, t! `3 R4 D9 Z/ L' C4 Y
1 在matlab的command窗口中输入- D/ ~; `, p$ ]: ]6 G; Z; ~/ V7 n
mcc -B sgl GUI.m
8 {. ]9 B2 f  s7 n3 p1 A2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器& Z: j& f& k& L/ @, Y
  {+ J1 o( f) L! Y: O6 B
此时仍需matlab所必需的动态连接库。
" K- I; |3 P+ [) n% Q) b3. 将 /extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上
: \, \: _6 j0 j( w1 k, C0 \4 z4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在将在指定目录下解压缩出bin和toolbox两个子目录,
: S' ~/ m4 e7 |7 K/ ?9 L其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共
8 C, P& g/ B+ Z% p5 `2 r有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。& a' J) \/ t. g1 s
而toolbox目录则必须与应用程序同一目录。
# z9 B9 H/ L. P1 v: `# V/ g5 z& W6 R# v5 z6 w& U! p
方法二:
  B3 r# {# b4 A: t: B+ Q3 K9 [. b3 ^% v& p/ L
matlab编程很方便,强大的矩阵运算功能,很多好用的工具箱,但是一般程序都要在matlab环境中运行,能否脱离这个环境打包发布呢,matlab 也提供了这样的工具。
. M( E: g8 z  D7 ]- b& M1 Z" D' |0 l- m9 R; R
1. 转化为c/c++程序并编译为.exe! z0 q0 U; E' x/ |6 z: }" i. \3 {
先验证mcc是否可用,用matlab中的example验证即可& X4 p9 x6 y/ o7 f( i" a4 g/ y
建议不用matlab默认的lcc 编译器(可能有问题),可使用VC6编译器(按默认路径安装)+ Q- n! e9 ]. G+ }
由于带有界面,需要图像库支持,编译时应使用命令: mcc -B sglcpp pressure$ y0 {, a3 W7 ?
编译生成若干c/c++源码,以及.exe文件、bin目录中figure菜单条/工具条文件(.fig)等
- ]1 w0 _+ [3 m* U) U程序发布需要.exe、bin\、.fig
7 j1 F" n; N9 d# V; z- X8 G( F9 ?
3 j1 p% |% Y* x. g- O+ \2. 在未装matlab的电脑上运行程序需要数学运行时库、图像运行时库以及用到的工具箱mex文件
( M/ G, B2 E/ }" [3 k4 J( w0 D4 F  Z前两者已经在\matlab\extern\lib\win32mglinstaller.exe压缩包中,将其解压,并在环境变量path中添加解压到的路径2 d4 q3 {% d5 Z( M( {
另外若程序中还用到其他工具箱的东西,那么需要将此工具箱中需要的mex文件也一并放在解压到的路径,子文件夹位置与matlab中的位置相同, ^. o8 P6 V& N; X
# s* G9 l8 K  n( n3 D
3. 在确保.exe程序可以运行的情况下 可以用setup factory打包发布( g/ S" Z: `6 c) t& x
以下通过注册表自动添加path路径2 e, v2 G1 |0 E! ]& \3 _/ X
%————————————————————————————–0 E) Y5 e  n# d! g- r( y
Screen.Next(); — 进入下一个屏幕
# ?8 S) s/ ]* v/ o% x  @7 VresultDialog = Dialog.Message(“注意”, “向环境变量中加入matlab数学库及图象库的安装路径?”, MB_YESNO, MB_ICONINFORMATION, MB_DEFBUTTON1);" x( Y6 i  G( J/ Y  Z3 A  N. Z
if (resultDialog == IDYES) then –加入安装路径6 W+ s) B3 i, F$ ?% q7 X% A
strPath = Registry.GetValue(HKEY_CURRENT_USER, “Environment”, “path”, true);
+ ^4 Z: N0 e, j/ {0 k2 i( B$ n: } if strPath ~= “” then5 l  C4 f( ]6 H+ {2 k4 l! C1 `
strPath = String.Concat(strPath, “;”);" t9 X0 o& b2 h( ?8 \
end
, k0 A2 ]7 C4 L) w* ~& z6 Z strPathToAdd = SessionVar.Expand(“%AppFolder%”);
/ ?  \3 E+ _- y2 q% q# K; E  jstrPathToAdd = String.Concat(strPathToAdd,”file://MATLAB6p5//bin//win32″);
- l! Y! {0 c7 g: T/ \— 如果路径中无该位置,则加入! t/ y6 e2 b* G1 j0 B
if String.Find(strPath,strPathToAdd) == -1 then
# D4 x/ S' H& F  d( c$ i6 S strPath = String.Concat(strPath, strPathToAdd);* Q- _  ?: [- c  }; c: A) ?
Registry.SetValue(HKEY_CURRENT_USER, “Environment”, “path”, strPath, REG_SZ);: K% e+ A: o2 z: ~" I/ ^
end
; w$ o& }, W2 z$ w3 j$ G8 l' pend( b, c+ e  {1 c3 @; Q* J3 [! y( f
%————————————————————————————–
6 A$ M" d! i8 j- n方法三:5 K2 S0 Y2 A8 B( a, j) G. m
在网上搜了一个方法,还没有用过, 贴在这里仅供参考:
0 L+ l0 v6 A. [" p一、 完全可以,而且生成的.exe文件可以在没有安装matlab的机器上使用,方法吗---. X1 _0 n! m+ p( ^/ [
首先,使用mcc编译得到.exe文件,具体参数见帮助文件;
7 w; ]  ]9 o: M/ @9 E( ]其次,将.exe文件及相关资源文件以及一个称为mglinstaller.exe的软件包一起拷到别的机器上,运行mglinstaller.exe,并添加环境变量path,即可执行.exe文件7 d& _' G- P6 q1 T
第三,在MATLAB环境,执行命令
8 L, E* X0 c  _: m8 Zmcc -m -B sgl file.m. ]( q8 W' z" `+ |( h; q' @7 m
或者 mcc -p -B sglcpp file.m
1 P- [' y% S6 q  l3 D; P请键入help mcc看帮助。
4 @) D8 ~/ H& U. _1 Y) E( [mcc是在“command windows” 用的吗?
2 ^6 {; \8 s5 `1 C5 e- f只要“mglinstaller.exe”,与.exe文件及相关资源文件就可以了吗.0 x. A( R2 q) v# P' u5 s
还有“添加环境变量path”是path到.exe文件的环境中是吧?& f8 D: P  [  J8 J

- ?! D$ x$ ^: U/ X  ^' R/ c; s- Y( L二、 在matlab下的workspace里打comtool,点file-open project将我们先前建好的 comtest.cbl工程文件打开,再点component–package component就实现了打包,此时到 comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击它会解压出一些文件,再点击解压出来的 _install.bat就可以实现安装, D9 }/ q$ L9 m* d" Y$ O
三、 如何将gui生成exe ?. ~( n3 I, R" p+ H
已有gui.m文件和gui.fig文件5 z' V+ G/ w" d( b
1 在matlab的command窗口中输入4 A9 K- _; r) |3 ^' o9 ^
mcc -B sgl GUI.m( v6 w/ G+ _7 U! i6 C9 ^
2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器
8 f% c% x) D/ z0 A( b1 h& M此时仍需matlab所必需的动态连接库。
! r2 s' f. \: `7 @! z* r! T3. 将 /extern/lib/win32 /mglinstallar.exel拷贝到到待运行机器上" g: c8 y) v5 E; [  e* L$ ^
4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在 bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。
1 d" u/ k0 ?& X: A7 b$ u4 f+ ]; ?/ X5.大功告成。 9 z" E, k, ]0 q$ ~" c" [
5 T6 t/ A9 A# `( H; h7 L) F# {
外一篇:MATLAB M文件变exe文件
: q. p  a0 s. L' P0 c我也是最近才搞定的这个问题,按下述步骤进行,就没有问题,我已经运行成功,但是遇到你程序的bug的话,便会出现错误,关闭整个程序
( {: n, H" P2 K" C& z9 T希望这些对你有用
# ?: L7 v% @: J; y' W
, d" ~6 L+ t+ h/ Q4 Z如何将MATLAB程序编译成独立可执行的程序?如何将编译好的独立可执行程序发布在没有安装MATLAB的电脑上?下面将一步步实现:+ F% {9 E$ N/ I6 _( m

$ b! @5 j; y9 u4 p# A1 v. N* l1 B一、生成独立可执行的程序(exe文件)步骤
8 S& @5 w4 Q' u2 E+ C
7 [( g% {! T6 `# F% A1、安装编译器。可有多种选择,matlab自带了一个LCC,推荐使用VC++6.0,我基于VS 2003实现。  X% k7 p' p$ ~
2、设置编译器。在matlab命令行输入mbuild –setup以及mex –setup,选择安装的c编译器。$ j3 b( ~. q2 u8 F! @4 Y
3、调用编译器。此处使用MATLAB下的一个GUI平台deploytool下完全实现。在命令窗口输入deploytool即可看到。具体使用方法请Help。
, u1 z& V# o$ L/ B当然,也可以输入mcc -m filaname, filaname为要转成exe的m文件;* ~1 v& z1 l4 Q: z
注:在以前的版本中,用编译命令mcc -B sglcpp filaname;自2006的版本后,替换为mcc -mfilaname;+ f7 a, B1 U, q1 H$ D
4、安装\toolbox\compiler\deploy\win32目录下的MCRInstaller。
  t5 O% X/ W/ G/ N) G# b# H0 L6 i. M. C9 A
二、脱离matlab运行可执行程序
/ V1 Y# S6 F' L4 t9 K. A: U1 \MCR是由matlab的运行环境,占用不到300M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。MCR环境的设置文件存放目录如下:& K4 _6 B- u2 F1 H4 q$ W; r/ I  t
\toolbox\compiler\deploy\win32
7 o) z7 A3 X% v3 ^4 d文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中,(7.0以前的版本是mglinstaller.exe)。
  p7 f; K- s1 D3 p* B7 B  z) F在MATLAB里运行可执行程序的办法是在前面加一个!,比如:!picshow,后缀名可有可无。
7 |$ r$ r0 E( X1 F( |! s在其它没有安装matlab的机器上运行exe文件前:
8 N4 t3 C  w3 e# I首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境(换句话说不同版本不兼容)。
( K) E6 [1 d2 X' n其次是要将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到该计算机的环境变量中,通常是自动加载。
+ E' E7 V$ ]/ m$ k+ r4 _6 f如果没有,也可手动安装,添加的方法是:1 d6 M  ~: N3 ~0 s4 \) ^
右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。5 H1 _* a0 r5 z% ?( {# D2 S0 L
注:在安装过程中会弹出让安装Microsoft.NETFramework可以不用安装。
* B6 F; @- f5 P; ~最后就是将编译生成的相相关文件拷贝到同一目录下,双击即可运行。
& {5 x+ T  J$ V  g问题:目前此方法可完全运行在没有安装MATLAB以及C/C++的电脑上,但是如果是在AMD的CPU可以运行,但是不会出现任何MATLAB编译的界面。7 ^$ F, Q/ C6 X, k
美中不足就是,运行的时候dos的那个黑色地窗口一直存在。下面将实现去除黑屏的办法:+ [& F5 }0 K0 B! U0 a

, n/ v1 f# y9 D6 B! ?消除运行MATLAB生成的exe程序的dos黑屏的办法3 L& P$ Q- y2 B. T+ }
基于MATLAB生成exe文件后,每次运行都存在dos黑屏的问题,现在可以通过以下方法解决:
3 c2 h! K, [5 Y  g方法一: 在命令窗口输入:  {  x) Q- \4 j6 f& ^# p" \* T
cd(prefdir)! I- T7 c/ }7 I$ u2 U% ]9 ?
edit compopts.bat
- P% K: D- Q, s- j) w( V在打开的文件最后添加以下语句:
0 E* R. o0 X5 F9 C3 Q0 Y2 s6 N' H! Q/ ]) }
A.VC环境下:
3 }  q7 B( \2 m
# X% s8 i0 }2 L; pset LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup
9 D- p2 Q" V7 h# Y# }1 g, A
3 X  f0 t: m1 G* {B.LCC环境下:
1 v9 Y% b4 D( a7 V& y; L$ |& s; n6 Bset LINKFLAGS=%LINKFLAGS% -subsystemwindows
3 U: p5 Z2 a5 n  E$ \' z( I7 S: v8 {* `# o* L
C. Borland:
7 f, D+ d9 c" O' k6 t set LINKFLAGS=%LINKFLAGS% -aa
2 o: U7 [' \7 [6 I3 x6 s/ o% ^
) e" A' k, C# i; B保存以后,再重新编译m文件,生成的exe文件运行起来就没有dos窗口了
/ h$ m* T9 N- G- z, o: }: ^- L, x) h4 }: \* I
方法二:使用suppress工具:# a# ^: I* m8 E$ D) L1 k" ~) e
下载附件中的suppress压缩包后解压,(当然您可以自己去Google然后再下载)会看到一个suppress.ini文件,用记事本打开,然后将 其中“Name=test.exe”中text.exe的改为你生成的exe文件名。将suppress.exe(有个关盘和显示器的图标),改后的 suppress.ini放到你生成的exe的同目录下。执行suppress.exe或者您自己生成的exe可以了。当然您可以自己修改 suppress.exe的名字,改为您自己想要的名字。/ B0 L) [, M/ I4 y7 t8 [5 ]# `
( g4 c# C3 s3 O1 J0 |3 }! v0 @" q
其中的方法一在使用后生成的exe再到没有任何安装MATLAB的机子上运行也不会有黑屏了。- p/ b% y: \+ C# h: E
方法二的缺点就是要同时存在您生成的exe以及supress.exe,必须在同一目录下。
: I+ F- @- E* N
作者: jonejack11    时间: 2013-6-4 00:45
太复杂了,没看明白
作者: pcyaoqiang    时间: 2013-7-12 16:00
支持一下啊!!
作者: eagle1208    时间: 2013-7-20 14:48





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5