第21章 MATLAB程序编译_第1页
第21章 MATLAB程序编译_第2页
第21章 MATLAB程序编译_第3页
第21章 MATLAB程序编译_第4页
第21章 MATLAB程序编译_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2024/3/3合肥工业大学机械与汽车工程学院MATLAB程序编译山东省科学院计算中心刘焕进E-mail:liuhuanjinliu@2024/3/3MATLAB编译器的工作机理

MATLAB编译器的安装与配置编译部署

典型案例介绍本章的主要内容包括:2024/3/3第一节MATLAB编译器的工作机理2024/3/3MATLAB编译器产品简介;

MATLAB编译器的功能;几个要点:关于MATLAB编译器产生的应用程序或运行库;关于打包器(wrapper)文件;组件技术文件(CTF);本节的主要内容包括:2024/3/3MATLAB编译器产品是MATLAB应用程序集成与发布的一种重要工具,它是一个运行于MATLAB环境的独立工具。MATLAB编译器可以将M文件、MEX文件、MATLAB对象或其它MATLAB代码转换为C/C++代码,然后再调用外部C/C++编译器把产生的源代码编译、链接成独立的应用程序、库、COM对象以及Excel插件。

MATLAB编译器产品简介2024/3/3(1)将M文件编译成为可以在UNIX、Windows和Macintosh操作系统上独立运行的应用程序。独立运行的应用程序就是在其运行过程中可以不需要MATLAB软件的同时运行,此外,也可以在没有安装MATLAB软件的计算机上运行这些应用程序。(2)将M文件编译成为C和C++共享函数库(在Windows系统上应用的动态链接库DLLs,Linux和UNIX系统下为共享的库文件)。MATLAB编译器的功能2024/3/3(3)MATLABBuilderEX可以将MATLAB函数打包,以便MicrosoftExcel用户可以通过VBA在Excel程序中访问这些函数。(4)MATLABBuilderJA可以将MATLAB中的M代码函数封装到Java类中。Java类是Java代码的一部分,包含了Java方法以及执行动作的单元。(5)MATLABBuilderNE可以将MATLAB函数打包,以便.NET用户可以从任何CLS相兼容的语言中访问这些函数。2024/3/3一、关于MATLAB编译器产生的应用程序或运行库

当用户打包和部署由MATLAB编译器产生的应用程序和运行库时,必须包含MATLAB编译器运行库(MATLABCompilerRuntime,简称MCR

)以及由编译器产生的一系列支持文件。同时,必须在目标计算机上指定这些文件的系统路径,以便系统能够找到这些文件。MATLAB编译器产生的应用程序或运行库包括两部分:一个平台相关的二进制文件以及一个包含MATLAB函数和数据的文档(CTF)。应用程序的二进制文件由一个主函数组成,而运行库的二进制文件由多个用户输出的函数组成。几个要点:

2024/3/3二、关于打包器(wrapper)文件

要产生用户指定的、平台相关的二进制文件,编译器产生一个或多个打包器文件。打包器文件提供了指向被编译的M代码的接口(函数),通过这些接口,打包器文件可以创建MATLAB编译器生成的代码与所支持的可执行程序(如独立应用程序或库)之间的链接。打包器文件依据执行环境的不同而不同。

打包器文件主要实现如下功能:(1)通过特定的接口(函数)执行初始化和终止工作。(2)定义包含路径信息、密钥以及MCR所需的其它信息的数据数组。(3)提供必需的代码,用来将调用信息从接口函数传递给包含在MCR中的MATLAB函数。(4)对于应用程序,包含主函数(main函数)。(5)对于运行库,包含每个公开的M函数的入口点。当使用编译器产生的运行库时,在客户端代码中调用库初始化和终止例程。2024/3/3三、组件技术文件(CTF)

组件技术文件(ComponentTechnologyFile,简称CTF)。MATLAB编译器在编译的同时也产生组件技术文件(CTF),该文件独立于应用程序或运行库,并于每个操作系统平台相关的。该文件以.ctf作为后缀,包含定义应用程序或运行库的MATLAB函数和数据,并且在默认的情况下,内嵌于共享的C/C++库和独立的应用程序的二进制文件中。2024/3/3第二节MATLAB编译器的安装及配置2024/3/3

安装要求;

编译器的安装;编译器的配置;本节的主要内容包括:2024/3/3一、安装要求在安装MATLAB编译器之前,用户必须确保在系统中安装了合适版本的MATLAB软件。MathWorks公司的网站上提供了相关的信息,用户可在以下网页中查找编译器的相关信息:

/products/compiler/requirements.htmlMATLAB编译器的正常运行对操作系统或内存都没有特别的要求,只要操作系统和内存都支持MATLAB软件的正常运行即可。1、系统要求2024/3/3MATLAB编译器还需要在系统中安装其所支持的ANSIC/C++编译器,例如:BorlandC/C++、MicrosoftVisualC++、WatcomC/C++、LccC编译器等。通常,MATLAB编译器都支持第三方编译器的当前版本以及旧的版本。对于MATLAB以及MATLAB编译器所支持的最新的编译器列表,请参照MathWorks公司技术支持部门的技术备忘录,其网址为:/support/tech-notes/1600/1601.shtml2、支持的第三方编译器2024/3/3(1)支持的ANSIC/C++Windows平台编译器使用如下的32位的C/C++编译器可以产生32位Windows动态链接库(DLLs)或Windows应用程序(以MATLABV4.14(R2010b)编译器为例):(1)LccC2.4.1(包含于MATLAB中),这仅是个C编译器,不针对C++。(2)MicrosoftVisualC++(MSVC)6.0、8.0、9.0、10.0。(3)IntelC++11.1。(4)OpenWatcom1.8。(5)IntelVisualFortran10.1、11.1。(6)Microsoft.NETFrameworkSDK2.0、3.0、3.5。(7)SunJavaDevelopmentKit(JDK)1.6。(1)支持的ANSIC/C++UNIX平台编译器在Solaris平台上,MATLAB编译器支持本地系统编译器;在Linux、Linuxx86-64和MacOSX平台上,MATLAB编译器支持gcc和g++。2024/3/3二、编译器的安装MATLAB编译器包含于MATLAB软件产品中。因此,如果用户初次安装MATLAB软件产品,可以在安装的过程中选中要安装的MATLAB编译器产品,然后执行标准安装。如果在初次安装的过程中没有选中MATLAB编译器产品,可以重新运行安装程序,选中要安装的MATLAB编译器产品,然后安装即可。1、安装MATLAB编译器产品

2024/3/3安装MATLAB软件的过程中选择安装编译器产品2024/3/3要安装ANSIC/C++编译器,需要执行包含有C/C++编译器的安装向导,正常安装并正确配置即可。用户在安装C/C++编译器时可能会遇到有关配置的问题,下表提供了有关配置信息的常见问题。2、安装ANSIC/C++编译器

2024/3/3问题描述安装选项建议完全安装编译器。如果只安装一部分,可能会忽略MATLAB编译器所必需的组件安装调试器文件对于MATLAB编译器产品来说,没有必要安装调试器(DBG)文件微软基础类库(MFC)不需要16位动态链接库(DLLs)不需要ActiveX不需要从命令行中运行选择编译器从命令行运行的所有相关选项更新注册表根据安装程序需要而定安装MicrosoftVisualC++6.0如果需要改变编译器的安装位置,就必须改变Common文件夹的位置;不要改变VC98文件夹的默认位置2024/3/31、关于mbuild的应用

三、编译器的配置用户使用mbuild脚本可以方便地指定一个选项文件(optionsfile),该选项文件允许用户进行如下操作: ●为每个可支持的编译器设置默认的编译器和连接器选项; ●修改编译器或编译器设置; ●创建应用程序。mbuild简化了设置C或C++编译器的过程,用户只需使用mbuild的setup选项即可一次性确定所要使用的第三方编译器。MATLAB编译器(mcc)产品在一定的条件下自动启动mbuild。特别地,mcc–m或mcc-l(小写的L)将启动mbuild来执行编译和连接。2024/3/32、

配置ANSIC或C++编译器

说明:选项文件包含用来控制已安装的编译器的标志或设置,选项文件是与编译器相关的,MathWorks公司对不同的C/C++编译器都提供了不同的选项文件。用户可以根据需要修改选项文件的内容,但在通常情况下,用户不必关心选项文件的内容,而只是简单地使用mbuild的setup选项来配置C或C++编译器即可。使用下面的命令可以选择一个默认的编译器:mbuild–setup2024/3/3【例】配置编译器

>>mbuild–setup%调用mbuild脚本来启动配置PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:

%启动MATLAB的自定位系统,MATLAB会自动搜索系统中安装的编译器Wouldyoulikembuildtolocateinstalledcompilers[y]/n?ySelectacompiler:[1]Lcc-win32C2.4.1inD:\PROGRA~1\MATLAB\R2008a\sys\lcc[2]MicrosoftVisualC++6.0inD:\ProgramFiles\MicrosoftVisualStudio[0]NoneCompiler:2%选择编译器

Pleaseverifyyourchoices:%确定选择的编译器Compiler:MicrosoftVisualC++6.0Location:D:\ProgramFiles\MicrosoftVisualStudioArethesecorrect[y]/n?y%结束配置Tryingtoupdateoptionsfile:C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R2008a\compopts.batFromtemplate:D:\PROGRA~1\MATLAB\R2008a\bin\win32\mbuildopts\msvc60compp.batDone...2024/3/3验证编译器配置是否正确?

在当前目录中创建test.m文件,文件内容很简单:弹出信息框,显示“Hello,World!”信息。在命令窗口中调用mcc对test.m文件进行编译:mcc-mtest.m编译完成后,产生test.exe文件,用鼠标双击即可正常运行,表明编译器设置正确。2024/3/33、选项文件MATLAB软件中包含了用于Windows平台和UNIX平台的预置选项文件,如下表所列(以MATLABR2008a为例)。(注:这些选项仅适用于32位MATLAB软件)。通常情况下,用户不必关心选项文件是如何工作的。当然,用户也可以根据自己的需要来修改选项文件。2024/3/3选项文件编译器Windows平台(选项文件位于:{matlabroot根目录}\bin\win32\mbuildopts路径下)lcccompp.batLccC,V2.4.1(包含于MATLAB中)msvc60compp.batmsvc71compp.batmsvc80compp.batmsvc80freecompp.batMicrosoftVisualC/C++,V6.0MicrosoftVisualC/C++,V7.1MicrosoftVisualC/C++,V8.0MicrosoftVisualC/C++,V8.0ExpressEditionUNIX平台(选项文件位于:{matlabroot根目录}/bin/目录下mbuildopts.shSolaris平台下,使用本地的ANSI编译器;对于Linux和Macintosh平台,使用gccMATLAB中的预置选项文件列表:

2024/3/3要定位在Windows系统下的选项文件,mbuild脚本按照如下的顺序进行搜索:(1)当前目录;(2)Windows系统的用户配置文件目录。Windows系统的用户配置目录中包含了诸如桌面外观、最近使用的文件、“开始”菜单中的项目等用户信息。mbuild将在-setup过程中创建的选项文件compopts.bat保存到用户配置文件目录的一个子目录中(例如C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R2008a),如下图所示。初次运行mbuild命令时,它会在上述两个路径中搜索选项文件,一旦找到选项文件则停止搜索,并使用该选项文件。如果没有搜索到选项文件,则mbuild搜索计算机上已安装的编译器,并为该编译器使用MATLAB预置的选项文件;如果计算机上有多个编译器,则提示用户选择一个编译器。关于Windows操作系统中的选项文件2024/3/32024/3/3要定位在UNIX系统下的选项文件,mbuild脚本按照如下的顺序进行搜索:(1)当前目录;(2)$HOME/.matlab/current_release;(3)matlabroot/bin。

关于Unix操作系统中的选项文件2024/3/3第三节编译2024/3/3

有关MATLAB编译器技术

mcc命令详解输入输出文件本节的内容包括:2024/3/3一、有关MATLAB编译器技术MATLAB编译器4.0使用MATLAB运行库(MCR),MCR是一个使M文件能够执行的共享库的独立集合。使用MCR,可以在没有安装MATLAB软件的计算机上执行MATLAB文件。MCR提供了对MATLAB中几乎所有函数的支持。MCR使用了线程封锁技术,保证一次只能有一个线程允许访问MCR。1、MATLAB编译器运行库(MATLABCompilerRuntime)2024/3/3编译器4.0使用了组件技术文件(CTF)来容纳可部署的程序包。所有的M文件都被加密到CTF文档中,加密时使用高级加密标准(AES)密码系统,其对称密钥使用1024位的RSA来保护。MATLAB编译器所产生的每一个应用程序或共享库都有相关联的CTF文档。文档中包含所有与组件相关联的、基于MATLAB的内容(M文件、MEX文件,等等)。当CTF档案档案解压到用户的系统中时,这些文件仍保持加密状态。2、组件技术文件2024/3/3(1)依存关系检查 分析、判断用户提供的M文件、MEX文件以及P文件所依存的函数之间的关系,并创建文件列表。该列表包括由输入的M文件调用的所有M文件以及这些M文件所调用的文件,等等。此外,还包括所有内置函数以及MATLAB对象。(2)封装代码生成产生创建目标组件所需要的所有源代码,包括: ●应用于命令行的M函数的C/C++接口代码(ex21_3_1_main.c)。对于数据库和组件,该文件包括所有的接口函数。 ●组件数据文件,该文件包含运行时执行M代码所需的信息。这些信息包括路径信息以及用于加载保存在组件的CTF文档中的M代码的密钥。3、组件创建过程2024/3/3(3)CTF文档创建在依赖检查中创建的MATLAB文件(M文件和MEX文件)列表用于创建CTF文档。CTF文档包含组件正常执行所需要的文件。这些文件被加密并压缩到单个文件中以方便部署,目录信息也包含在其中,以确保目录中的文件能被正确地安装到目标计算机。(4)C/C++编译将在“封装器代码生成”中产生的C/C++文件编译为目标代码。用户在mcc命令行中指定的C/C++代码也同时被编译。(5)连接将产生的目标文件和必需的MATLAB库文件相连接,并生成最终的组件。

C/C++编译和连接使用包含在MATLAB编译器产品中的mbuild应用程序。2024/3/3MATLAB编译器的编译过程2024/3/3二、mcc命令详解1、mcc命令的语法mcc[-options]mfile1[mfile2...mfileN][C/C++file1...C/C++fileN]其中,参数options可以选择如下的值:(1)-a

使用–afilename来指定直接添加到CTF文档中的文件,也可以使用多个-a选项。MATLAB编译器在MATLAB路径上查找这些文件,如果文件不在MATLAB路径上,需要指定文件的完整路径名称。如果-a选项中只包括目录的名称,则目录中的所有文件将循环添加到CTF文档中。例如:将当前工作目录中的testdir目录及其子目录中的所有文件都添加到CTF文档中,并且目录的子树也保存到CTF文档中。

2024/3/3mcc–mhello.m–a./testdir如果在文件名中包含通配符(*),则只有在目录中符合给定格式的文件被添加的CTF文档中,而子目录中的文件却不会被添加。例如:mcc-mhello.m-a./testdir/*在本例中,在./testdir目录中的所有文件都会被添加到CTF文档中,而在./testdir目录下的所有子目录中的文件则不被添加。mcc-mhello.m-a./testdir/*.m./testdir目录下所有扩展名为.m的文件都将被添加到CTF文档档案中,而在./testdir目录下的所有子目录中的文件则不被添加。2024/3/3其中,参数options可以选择如下的值:(1)-a

使用–afilename来指定直接添加到CTF文档中的文件,也可以使用多个-a选项。MATLAB编译器在MATLAB路径上查找这些文件,如果文件不在MATLAB路径上,需要指定文件的完整路径名称。如果-a选项中只包括目录的名称,则目录中的所有文件将循环添加到CTF文档中。例如:将当前工作目录中的testdir目录及其子目录中的所有文件都添加到CTF文档中,并且目录的子树也保存到CTF文档中。

2024/3/3(2)-b产生与Excel兼容的公式函数产生一个VisualBasic文件(.bas),该文件包含一个用于编译器产生的COM对象的Excel公式函数(MicrosoftExcelFormulaFunction)界面,允许MATLAB函数作为单元公式函数使用。(3)-B指定束(bundle)文件使用指定文件的内容来替代在mcc命令行中的文件。使用语法为:-Bfilename[:<a1>,<a2>,...,<an>]束文件filename应只包含mcc命令行选项、相应的参数、和/或其它文件名。束文件可以包含其它-B选项。下表列出了MATLAB编译器产品中的束文件列表。束文件创建结果内容cpplibC++库-Wcpplib:<shared_library_name>-Tlink:libcsharedlibC共享库-Wlib:<shared_library_name>-Tlink:lib2024/3/3(4)-c(小写C)只产生C代码当使用宏选项时,只产生C封装代码,而不启动mbuild而产生独立的应用程序。该选项相当于放在mcc命令行的末尾的-Tcodegen。(5)-C(大写C)默认情况下不嵌入CTF文档缺省情况下,指示mcc不在C/C++文件、main/Winmain共享库和独立的二进制文件中嵌入CTF文档。(6)-d指定输出目录-ddirectory将编译产生的输出存放到由-d选项指定的目录directory中。2024/3/3(7)-e禁止MS-DOS命令窗口当产生独立的应用程序时,禁止MS-DOS命令窗口的出现,使用-e来替换-m选项。该选项仅用于Windows系统。使用-R选项来产生错误日志文件:mcc-e-R-logfile,"log_file.txt"-vfunction_name该宏等价于:-WWinmain-Tlink:exe使用-e选项需要应用程序是使用微软的编译器(例如MicrosoftVisualStudioExpress)编译的,而不是使用MABLAB自带的编译器编译的。(8)-f指定的选项文件-ffilename使用指定的选项文件覆盖默认的选项文件。该选项可使用户在调用不同的MATLAB编译器产品时使用不同的ANSI编译器,该选项直接传递给mbuild脚本。MathWorks建议用户不使用该选项,而直接使用mbuild–setup命令。2024/3/3(9)-F指定的项目文件。指定mcc使用包含在指定的项目文件(.prj)中的设置。当调用mcc时,使用-Fproject_name.prj用来指定项目文件的名称为project_name。该选项使得.prj文件及其所有附属的设置都返回给mcc。使用mcc或deploytool创建的项目文件都可以用到该选项中。(10)-g产生调试信息包含由MATLAB编译器产生的C/C++代码的调试信息,mbuild会将合适的调试标志传递给C/C++编译器。调试选项使得用户可以追溯在什么地方产生了错误:是在MCR的初始化、函数的调用还是终止例程中产生了错误。该选项不允许用户使用C/C++调试器来调试用户的M文件。(11)-G同-g,仅用于调试2024/3/3(12)-I添加目录到引用路径中 向引用目录列表中添加新的目录。每一个-I选项都会在搜索路径的列表的开头添加一个目录。例如:-I<directory1>-I<directory2> 设置搜索路径,从而directory1首先用于M文件的搜索,接下来是directory2。该选项对于不能访问MATLAB路径的独立编译来说是很重要的。(13)-l(小写L)生成函数库 该选项为命令行中的每一个M文件生成一个库封装函数,并调用C编译器来创建共享库,该共享库导出这些函数。库的名字与组件的名字相同,也就是命令行上的第一个M文件的名字。该宏等价于:-Wlib:stringlink:lib(14)-m产生一个独立的应用程序该宏等价于:-Wmain-Tlink:exe。 使用-e选项代替-m选项来产生独立的应用程序,同时禁止MS-DOS命令窗口的出现。使用-e选项需要应用程序是使用Microsoft的编译器(例如MicrosoftVisualStudioExpress)编译的。2024/3/3(15)-M定义编译时间选项-Mstring将string直接传递给mbuild脚本。这提供了一种定义编译时间选项的有用机制,例如:”-Dmacro=value”。如果使用多个-M选项,只有最右边的一个起作用。(16)-N清除路径有效清除最小目录集以外的路径,下列的核心目录及其子目录除外:matlabroot/toolbox/matlabmatlabroot/toolbox/localmatlabroot/toolbox/compiler/deploy在mcc命令行中包含-N选项,允许用户替换原始路径中的目录,同时保留引用目录的相对顺序。出现在原始路径中的引用目录中的所有子目录也将被替换。此外,-N选项保留用户已经引用、但不在matlabroot/toolbox路径下的所有目录。2024/3/3(17)-o指定输出文件名称指定最终可执行文件的名称(仅用于独立的应用程序)。使用-ooutputfile来命名MATLAB编译器产生的最终可执行输出文件。在指定的名称后将添加合适的、与平台相关的扩展名(如.exe用于Windows独立应用程序)。(18)-p向编译路径中添加目录和选项-N联合使用,可以添加matlabroot/toolbox路径下指定的目录和子目录到MATLAB编译路径下。-N-pdirectory其中,directory是要添加的目录。如果directory不是绝对路径,则假定它在当前工作目录下。以下规则定义了这些目录是如何在编译路径中引用的:●如果目录在原始MATLAB路径上,则目录及其子目录都被添加到编译路径下。●如果目录不在原始MATLAB路径上,在该目录不会被添加到编译路径下。用户可以使用-I选项来添加。

2024/3/3(19)-R运行时间(仅适用于独立的应用程序)提供MCR运行库选项。使用-Roption可以提供如下表所列的运行选项。选项描述-nojvm不使用Java虚拟机(JVM)-nojit不使用MATLABJIT(用于加速M文件执行的二进制代码生成)-nodisplay禁止MATLABnodisplay运行时间警告(20)-S创建单个MCR当编译多个COM对象时,创建单个MCR,每个组件的实例都使用相同的MCR。该选项需要MATLABBuilderNE编译器。2024/3/3(21)-T指定产生目标文件的阶段和类型使用-Ttarget来定义输出的类型。有效的target的值如下表所列。(22)-v详述-v选项传递给mbuild并显示关于mbuild的信息。包括:MATLAB编译器版本号、源文件名称、产生的输出文件名称、mbuild的启动。目标描述codegen产生C/C++封装文件。缺省值为codegencompile:exe同codegen,同时将C/C++文件编译为适合连接进独立应用程序里的目标形式compile:lib同codegen,同时将C/C++文件编译为适合连接进共享库/DLL里的目标形式link:exe同compile:exe,同时将目标文件连接进独立的应用程序link:lib同compile:lib,同时将目标文件连接进共享库/DLL2024/3/3(23)-w警告信息显示警告信息。使用-woption[:<msg>]来控制警告信息的显示。有效的语法形式如下表所示。语法描述-wlist产生一个将<string>映射到警告信息的表格-wenable允许全部的警告信息-wdisable[:<string>]禁止与<string>相关联的警告信息。去掉<string>将禁止所有的警告信息-wenable[:<string>]允许与<string>相关联的警告信息。去掉<string>将允许所有的警告信息-werror[:<string>]将与<string>相关联的警告信息当作错误信息。去掉<string>将所有的警告信息当作错误信息2024/3/3(24)-W打包器文件使用-Wtype来控制打包器函数的创建。用户提供一组函数,MATLAB编译器产生打包器函数以及合适的全局变量定义。下表列出了有效的选项。类型描述main产生一个POSIX外壳main()函数。(POSIX为可移植操作系统接口)lib:<string>当将编译器产生的代码编译为一个较大的应用程序时,创建一个C接口,并且产生一个初始化和终止函数。该选项也产生一个头文件,该头文件包含指定M文件中的所有公开函数的原型。<string>指定了生成的C/C++文件以及头文件的基本文件名。产生一个包含所有非静态的函数名称的.exports文件cpplib:<string>当将编译器产生的代码编译为一个较大的应用程序时,创建一个C++接口,并且产生一个初始化和终止函数。该选项也产生一个头文件,该头文件包含指定M文件中的所有公开函数的原型。<string>指定了生成的C/C++文件以及头文件的基本文件名。产生一个包含所有非静态的函数名称的.exports文件none不产生打包器文件。默认值为none2024/3/3(25)-Y许可文件使用-Ylicense.dat_file来使用指定的参数覆盖默认的license.dat文件。(26)-z指定路径为库文件和引用文件指定路径。使用-zpath来指定编译器库文件和引用文件所使用的路径为path,从而代替由matlabroot返回的路径。(27)-?帮助信息在命令提示下显示MATLAB编译器的帮助信息。2024/3/32、使用mcc命令(1)编译器选项可以给mcc指定一个或多个MATLAB编译器选项。例如:mcc-m-gmyfile.m宏是MATLAB提供的编译器选项,使得用户不必手工组合多个选项来实现指定的编译工作。例如:选项-l与下列宏等价:-Wlib-Tlink:lib选项-m与下列宏等价:-Wmain-Tlink:exe2024/3/3(2)组合选项可以把不带参数的选项组合到一起使用。例如:mcc-mgmyfile.m带参数的选项通常不能组合到一起,除非把带参数的选项及其参数放置在命令列表的最后。例如:下面是正确的用法:%选项单独列出mcc-v-Wmain-Tlink:exemyfile.m%将选项组合mcc-vWmain-Tlink:exemyfile.m下面是错误的用法:mcc-Wvmain-Tlink:exemyfile.m

%错误的用法2024/3/3(3)命令行中的冲突选项如果在命令行中使用的选项发生冲突,则编译器优先考虑最右侧的选项。例如:在命令行中使用以下选项:mcc-m-Wnonemyfile.m由于-m选项相当于:-Wmain-Tlink:exe,因此两个-W选项发生冲突,则编译器只取最右边的选项,即-Wnone选项。所以,以上命令与下列命令等价:mcc-Wnonemyfile.m2024/3/3三、输入和输出文件【例2】MATLAB编译器以ex21_3_1.m作为输入,产生独立的应用程序ex21_3_1.exe。1、独立的可执行文件functionex21_3_1x=0:pi/50:2*pi;y=sin(x);figure(1);plot(x,y,'r*');gridon2024/3/3文件描述ex21_3_1_main.c包含程序的main函数的主打包器C源文件。main函数取得由命令行传递的输入参数,并把参数作为字符串传递给ex20_2函数。ex21_3_1_mcc_component_data.c包含MCR用来运行应用程序的数据的C源文件。这些数据包括路径信息、密钥和其它用于MCR的初始化信息。ex21_3_1.ctfCTF文档。该文件包含一个用于组成应用程序的M文件的压缩和加密的档案。ex21_3_1.exe应用程序的主文件。该文件读取和执行保存在CTF文档中的内容。在Windows系统中,该文件为ex21_3_1.exe最终产生的文件列表:2024/3/3【例】在本例中,MATLAB编译器将M文件ex21_3_1.m编译为C共享库文件libmyshared.dll。用户在配置好编译器后,在命令窗口中输入命令:mcc-Wlib:libmyshared-Tlink:libex21_3_1.m2、C共享库文件编译所产生的文件如下表所列:2024/3/3文件描述libmyshared.c数据库打包器C源代码文件,包含数据库的输出函数,代表与M函数(ex21_3_1.m)的C接口,以及数据库的初始化代码libmyshared.h数据库打包器头文件,改文件将被调用limyshared.dll的输出函数的应用程序引用libmyshared_mcc_component_data.c包含MCR用来初始化和使用数据库的数据(包括路径信息、密钥以及其它MCR初始化信息)的C源文件libmyshared.exportsmbuild用于连接数据库的输出文件libmyshared.ctfCTF文档。该文件包含一个用于组成该共享库的M文件的压缩和加密的档案,以及在运行时被M文件调用的其它文件以及数据libmyshared共享数据库二进制文件。在Windows平台上,改文件为libmyshared.dll,在Solaris平台上,该文件为libmyshared.solibmyshared.exp连接器使用的输出文件。连接器使用输出文件来创建包含输出的程序,通常是动态链接库文件(.dll)。libmyshared.lib输入数据库。2024/3/3【例】在本例中,MATLAB编译器将M文件ex21_3_1.m编译为C++共享库文件libmyshared.dll。在命令窗口中输入命令:mcc-Wcpplib:libmyshared-Tlink:libex21_3_1.m3、C++共享库文件编译所产生的文件如下表所列:2024/3/3文件描述libmyshared.cpp数据库打包器C++源代码文件,包含数据库的输出函数,代表与M函数(ex21_3_1.m)的C++接口,以及数据库的初始化代码libmyshared.h数据库打包器头文件,改文件将被调用limyshared.dll的输出函数的应用程序引用libmyshared_mcc_component_data.c包含MCR用来初始化和使用数据库的数据(包括路径信息、密钥以及其它MCR初始化信息)的C++源文件libmyshared.exportsmbuild用于连接数据库的输出文件libmyshared.ctfCTF文档。该文件包含一个用于组成该共享库的M文件的压缩和加密的档案,以及在运行时被M文件调用的其它文件以及数据libmyshared共享数据库二进制文件。在Windows平台上,改文件为libmyshared.dll,在Solaris平台上,该文件为libmyshared.solibmyshared.exp连接器使用的输出文件。连接器使用输出文件来创建包含输出的程序,通常是动态链接库文件(.dll)。libmyshared.lib输入数据库。2024/3/3第四节部署2024/3/31、确定需要打包的文件;2、使用部署工具(DeploymentTool);3、部署到目标计算机。本节主要包括以下内容:2024/3/3当用户创建了数据库、组件或应用程序后,需要将运行时所需的文件打包,以便部署到目标计算机中。那么,对不同的应用程序类型,到底哪些文件需要打包呢?以下分别介绍。一、确定需要打包的文件2024/3/31、独立的应用程序软件模块描述MCRInstaller.exe(Windows)MCRInstaller是个自解压可执行程序,用来安装运行应用程序所需的组件,该文件包含在MATLAB编译器产品中MCRInstaller.bin(UNIX)MCRInstaller是个自解压可执行程序,用来安装在UNIX机器上(Mac除外)运行应用程序所需的组件,该文件包含在MATLAB编译器产品中MCRInstaller.dmg(Mac)MCRInstaller.dmg是个自解压可执行程序,用来安装在Mac机器上运行应用程序所需的组件,该文件包含在MATLAB编译器产品中application_name.ctfmbuild用于连接数据库的输出文件libmyshared.ctfCTF文档。是与平台相关的,必须与目标计算机平台相一致application_name.exe(Windows)MATLAB编译器产生的应用程序application_name(UNIX)2024/3/32、C/C++共享库软件模块描述MCRInstaller.exe(Windows)同表21.4-1MCRInstaller.bin(UNIX)同表21.4-1MCRInstaller.dmg(Mac)同表21.4-1Unzip(UNIX)用来解压MCRInstaller.zip,目标计算机必须有解压软件libmatrix.ctfCTF文档。是与平台相关的,必须与目标计算机平台相一致libmatrix共享数据库;扩展名依据平台而定,在Windows平台中为.dlllibmatrix.h共享数据库的头文件2024/3/33、.NET组件软件模块描述componentName.ctfCTF文档componentName.xmlxml文档文件componentName.pdb(如果选择了调试模式)包含调试信息的数据库文件componentName.dll组件集成文件MCRInstaller.exeMCR安装文件2024/3/3软件模块描述mwcomutil.dll用于处理数组的应用程序,在数据转换中提供类型定义componentName.ctfCTF文档componentName_version.dll包含编译的M代码的组件MCRInstaller.exeMCR安装文件4、COM组件2024/3/35、使用MicrosoftExcel的COM组件软件模块描述componentName.ctfCTF文档componentName_projectversion.dll编译的组件MCRInstaller.exeMCR安装文件*.xla在<projectdir>\distrib目录中的用户创建的内嵌Excel的文件6.Java组件用户需创建包含componentName.jar文件的Java软件包,该软件包在componentName.ctf文件中包含指向M代码的Java接口。2024/3/3部署工具是

MATLAB编译器配备的图形用户界面(GUI)。用户可以通过该工具提供的图形用户界面来使用

MATLAB命令行接口,以编译并打包要部署在不同计算机上的组件。用户可通过部署工具执行以下操作:(1)指定主MATLAB函数。(2)添加无法通过依赖检查自动识别的文件,如数据文件或图像等。(3)保存编辑和打包首选项内容到项目文件(.prj)中。(4)对MATLAB应用程序进行编译和打包。当用户构建应用程序或组件时,MATLAB编译器可以确定需要哪些MATLAB函数来支持用户添加的文件并对代码进行加密,然后将这些文件封装为可执行文件或组件。

二、使用部署工具2024/3/3在CommandWindow中输入deploytool命令,将会出现如图所示的对话框。用户可以选择新建一个部署项目,或者打开一个已有的部署项目。2024/3/31、新建项目选择File->NewDeploymentProject菜单项或者使用鼠标点击工具条上的New按钮,将会弹出“NewDeploymentProject”对话框

2024/3/3分别选择左侧列表中的MATLAB编译器产品,在右侧列表中列出对应的编译器产品所能创建的应用程序类型。MATLABCompiler产品2024/3/3MATLABBuilderEX产品2024/3/3

MATLABBuilderNE产品2024/3/3

MATLABBuilderJA产品2024/3/32、向项目中添加需要编译的文件在新建项目中的“NewDeploymentProject”对话框中点击OK按钮,即可弹出如下图所示的对话框,选择Project菜单中的AddFile菜单项或点击工具条中的“AddFile”按钮,可弹出“Open”对话框,用户可以定位所需的文件并把它们添加到项目中。2024/3/33、设置项目的相关信息选择Project菜单的“Setting...”菜单项或点击工具条上的“Setting...”按钮,可打开“DeploymentProjectSettings”对话框,在对话框中可对项目的相关选项进行设置。2024/3/3(1)General选项卡的设置2024/3/3定义应用程序的名称(Applicationname),如myplot。在OutputDirectories编辑区域,用户可以设置编译过程中使用的中间目录(Intermediate)以及输出目录(Output)。默认情况下,deploytool会在图21.4-2所示的Location目录下创建两个子目录Project_Name\src和Project_Name\distrib,其中Project_Name为在图21.4-2所示的对话框的Name中输入的项目名称。deploytool会把编译过程中产生的中间文件存放到Project_Name\src中间目录中,把最终编译好并可用来部署的文件存放到Project_Name\distrib目录中。

可以选择是否产生详细的输出信息(GenerateVerboseOutput)。可以选择是否CTF文档嵌入到应用程序中(EmbedCTFarchiveintotheApplication);在MCR选项中,可以选择在运行时是否加载Java虚拟机(JVM)等。在“CompilerOptionsFile”区域,可以定位所需要的选项文件。2024/3/3(2)“ToolboxesonPath”选项用户可以设置在项目的创建过程中要搜索哪些工具箱。去掉不必要的工具箱可以减少编译的时间,也会减小CTF的大小。2024/3/3(3)“C/C++Compiler”选项用户可以修改C/C++编译器设置。例如,为封装的代码产生调试信息,可以帮助用户发现应用程序中的问题。2024/3/3(4)“Warning”选项用户可以指定在编译的过程中将在输出窗口中产生哪些MATLAB编译器信息。2024/3/3(5)“Packaging”选项用户可以对程序打包所需要的信息和文件进行设置。用户可以指定程序包的名称(PackageName),将指定的MCR文件包含进程序包,同时,也可以指定项目中未包含、但为使MATLAB代码可以正常运行所需要的外部文件。2024/3/34、对项目进行编译和链接经过上述2、3两个步骤,用户可选择DeploymentTool窗口上的Tools菜单中的Build菜单项,或者点击工具条上的“Buildtheproject”按钮,即可对项目进行编译和连接。并在“DeployToolOutput”窗口中给出信息提示。2024/3/3在编译和连接完成后,可以看到在项目所在的路径下新产生了两个子目录,其中,distrib子目录中包含文件即为用户用来部署到目标计算机中的文件。2024/3/35、打开一个已有项目在利用mcc命令来将m文件编译为独立的应用程序时,可以看到,在目标文件夹中的文件中包含了后缀为.prj的文件,该文件即为相应的项目文件,可以使用deploytool部署工具来打开该文件。在deploytool中打开该文件后,用户可以重新修改项目的设置,然后重新编译该项目文件。6、将文件打包无论对于由mcc命令编译产生的文件或者由deploytool工具编译产生的文件(.prj),都可以使用deploytool工具打开,然后将需要的文件进行打包,以便部署到目标计算机中。用户可以对需要打包的文件进行设置,可以选择将MATLABCompilerRuntime(MCR)包含到软件包中,也可以选择将其它需要的文件包含到软件包中。选择Tools菜单中的Package菜单项,或者点击工具条上的“Packagetheproject”按钮,deploytool工具会自动将所需的文件进行打包处理,并且在输出窗口中给出提示信息。2024/3/3打包信息提示:2024/3/31.Windows操作系统下的部署步骤:(1)打开包含运行时所需的软件包。(2)在目标计算机上运行MCRInstaller一次。MCRInstaller将打开一个命令窗口,开始安装。(3)如果部署的是Java应用程序,用户必须在目标计算机上设置Java类所在的路径。2.Unix操作系统下的部署步骤:(1)安装MCR。找到MCRInstaller.zip文件,把它复制到目标计算机上的文件夹中。该文件夹将成为数据库或应用程序的安装文件夹。然后解压MCRInstaller.zip文件,并安装MCR。(2)正确地设置路径环境变量。(3)如果部署的是Java应用程序,用户必须在目标计算机上设置类的路径。三、部署到目标计算机2024/3/3【例】将包含应用程序的软件包部署到目标计算机中将例21.4-1生成的软件包first_pro_pkg.exe复制到目标计算机中的某一个文件夹,然后按照如下步骤来部署。(1)双击first_pro_pkg.exe图标,运行软件包自解压程序;2024/3/3(2)自动运行MCRInstaller.exe程序,安装MCR。2024/3/32024/3/3(3)安装完MCR后,即可在软件包所在的文件夹中找到first_pro.exe文件,双击该文件,即可显示DOS界面,解压CTF文件,并运行应用程序。2024/3/3第五节典型案例介绍2024/3/3以下示例程序均以MATLABCompiler4.8(R2008a)为编译工具。有关Compiler4.8的详细信息,请参考MATLAB在线帮助文档:/help/toolbox/compiler/rn/bri8syh-1.html说明:2024/3/31.案例背景在MATLAB中的M文件有两种:脚本文件(MATLABscripts)和函数文件(MATLABfunctions)。两种M文件都是以.m作为文件扩展名,但有很大的不同。

MATLAB提供了丰富的绘图函数,可以实现强大的绘图功能。利用句柄图形(HandlesGraphics)的概念,用户可以解决复杂的绘图问题。本例主要讲述利用MATLAB提供的命令来创建图形窗口、坐标轴、按钮控件,并且在坐标轴中绘制图形,修改图形的颜色,将代码保存为MATLAB脚本文件。最后,利用MATLAB编译器编译为独立的应用程序。一、将脚本M文件编译为独立的应用程序2024/3/32.编程要点利用5.4中介绍的直接编写M文件来开发图形用户界面的方法来创建一个图形窗口(figure),名称为“changecurvecolor”;一个坐标轴(axes),在其中绘制正弦曲线;在其上创建四个下压按钮(pushbutton),其中三个用于改变曲线的颜色,一个用于关闭图形窗口。将代码保存为脚本文件。利用MATLAB自带的LccC编译器,调用mcc-m命令来编译M文件。生成的应用程序在运行时带有MS-DOS窗口。利用MicrosoftVisualC++6.0编译器,调用mcc-e命令来编译M文件。生成的应用程序在运行时不再带有MS-DOS窗口。将生成的可执行文件打包,以便部署到其它计算机中。2024/3/33.实现(1)创建图形用户窗口,代码保存为curve_color.m文件;(2)设置MATLAB自带的LccC编译器,并编译M文件。>>mbuild–setup>>mcc-mcurve_color.m-ddir1编译完成后,在dir1中出现编译生成的文件。2024/3/3双击curve_color.exe文件,即可运行应用程序,可以看到,程序运行时会出现MS-DOS窗口。2024/3/3(3)设置MicrosoftVisualC++6.0编译器,并编译M文件。>>mbuild–setup>>mcc-mcurve_color.m-ddir1编译完成后,在dir1中出现编译生成的文件。2024/3/3双击curve_color.exe文件,即可运行应用程序,可以看到,程序运行时不会出现MS-DOS窗口。(4)利用DeploymentTool将应用程序进行打包处理。2024/3/31.案例背景函数M文件也是用户使用MATLAB编程时经常使用的文件形式之一。将MATLAB代码封装为函数M文件的形式,可以使得M文件能够接受用户的输入信息,并将处理的结果返回给用户。由其是对于大型的应用程序,可以将其划分为一个个小的功能模块,每一个功能模块使用函数M文件来实现,最终集成为整个应用程序。使用函数M文件,用户也可以很方便地扩展MATLAB的工具箱,等等。本例讲述如何将函数M文件编译为独立的应用程序。将上述示例程序修改为函数M文件保存,并且调用MATLAB编译器来创建独立的应用程序。二、将函数M文件编译为独立的应用程序2024/3/32、编程要点要将curve_color.m应用程序修改为函数M文件,用户需要执行如下的操作:(2)代码的开头添加function关键字来定义函数的名称。functioncurve_colorh0=figure('toolbar','none',...'units','normalized',...'position',[0.20.20.60.5],...'name','changecurecolor');…function为MATLAB的关键字,用来定义函数。curve_color为函数的名称,函数名称必须按照MATLAB中对变量名称的约定来定义。函数也可以选择带输入和输出参数,例如:function[out1out2…]=funname(in1,in2,…)在这里选择不带输入和输出参数。2024/3/3(2)修改程序的代码称。由于定义各个按钮的回调函数(Callback)为字符串形式,回调函数的代码在基本(base)工作空间中执行,其中的set语句引用的图形对象的句柄必须保存在基本工作空间中。而将M文件定义为函数M文件后,图形对象的句柄是保存在了函数(caller)工作空间中的,而这两个工作空间中的变量是不能直接相互访问的。所以,如果不修改代码,则运行程序并点击按钮后会出现如下错误,提示句柄无效:???Errorusing==>setInvalidhandleobject.???ErrorwhileevaluatinguicontrolCallback要解决这个问题,有两条途径:将函数M文件中的变量定义为全局变量全局变量的作用于为整个MATLAB工作空间,全局变量一旦定义,MATLAB的任何函数都可以访问和修改。要把变量定义为全局变量,只需调用global命令即可。global命令的调用格式如下:globalXYZ其中,X、Y、Z表示要定义的全局变量的名称。可以同时定义多个全局变量,变量的个数没有严格的限制。用户在引用全局变量时,必须调用global命令来事前声明全局变量,然后才能调用全局变量。清除全局变量时,需调用clear命令:clearglobalvar%其中,var为全局变量的名称。

2024/3/3将函数M文件中的变量指派到基本工作空间中assignin将函数M文件中的变量的值指派给指定工作空间中的变量。函数的调用格式如下:assignin(ws,'var',val);其中,ws为标识工作空间的字符串,其值可以为“base”或“caller”;val为函数M文件中的局部变量,“var”为指定工作空间ws中的变量,若变量“var”在指定工作空间中不存在,则MATLAB自动创建该变量。修改程序的代码,将图形句柄k的值指派到基本工作空间中的变量k:assignin('base','k',k);修改后的M文件见curve_color2.m。函数M文件的编译和部署的方法与脚本M文件相同,在此不赘述。2024/3/31.案例背景MATLAB提供了一个专门用于GUI程序设计的快速开发环境-GUIDE。利用GUIDE这一界面设计工具集,用户不需要编写任何代码,即可以通过鼠标的简单拖拽就能迅速地产生各种GUI控件,并可以根据要求方便地修改它们的外形、大小、颜色等属性,从而帮助用户方便地设计出各种符合要求的图形用户界面程序(GUI)。此外,比较复杂的MATLAB程序都是由多个M文件组成的。例如:一个应用程序有一个主函数M文件,主函数M文件又要调用其它的两个M文件,而这两个M文件又可能会调用其它的M文件,从而构成比较复杂的应用程序。对由多个M文件组成的应用程序的编译也是用户需要掌握的。三、对由GUIDE创建的GUI程序编译为可独立运行的程序2024/3/32、编程要点

MATLAB编译器在编译的过程中会有“依存关系检查”这一步骤,MATLAB编译器会对用户用于编译的M文件进行检查,确定用户提供的M文件需要调用哪些M文件以及这些M文件又要调用哪些M文件,等等。此外,MATLAB编译器也分析用户提供的M文件还要调用哪些MATLAB内置函数以及MATLAB对象。在依存关系检查中创建的MATLAB文件(M文件和MEX文件)列表用于创建CTF文档,CTF文档包含应用程序正常执行所需要的文件。这些文件被加密并压缩到单个文件中以方便部署,目录信息也包含在其中,以确保目录中的文件能被正确地安装到目标计算机。

因此,在对包含多个M文件的MATLAB程序进行编译时,用户只需在mcc命令行中包含主函数M文件即可,MATLAB编译器会自动查找所需要的其它M文件,不需要用户逐个进行编译,用户也不需要担心会有哪些函数会被遗漏。

由GUIDE创建的应用程序包括M文件和FIG文件,用户在利用MATLAB编译器进行编译时,其编译方法与普通的M文件的编译是一样的。如果存在多个M文件,则只需对主M文件进行编译。2024/3/31.案例背景C语言是目前世界上流行、使用最广泛的面向过程的高级程序设计语言,许多应用软件都是用C语言编写的。C语言提供了基本的函数库,程序员可以使用这些函数库来完成复杂的运算,处理大量的数值数据。但有时,这些基本的函数往往不能满足要求,需要程序员来编写高级函数来完成所需的运算,如矩阵运算等。而MATLAB具有几百个数学函数,可以完成数值分析、模拟与运算等强大的功能。因此,如果能在C开发环境中调用MATLAB强大的函数库,则能为应用程序的开发提供很大的方便。

可以利用MATLAB编译器将MATLAB函数打包成C或C++共享库,然后在C或C++编程时调用这些共享库中的函数,从而就像从MATLAB命令行中来调用这些函数一样方便。四、将MATLAB程序编译为C共享库2024/3/32.编程要点(1)使用mcc命令创建C共享库假设要将myfilename.m文件编译为C共享库,可以使用下面的命令:mcc-Bcsharedlib:libnamemyfilename.m-v其中,-Bcsharedlib选项是一个束选项,它扩展为-Wlib:<libname>-Tlink:lib-Wlib:<libname>选项让MATLAB编译器生成一个函数打包器,名称为libname。-Tlink:lib指定目标输出为共享库。用户还可以使用下面的命令来生成C共享库myfilename.dll:mcc-lmyfilename.m-v

如果要将多个M文件编译为C共享库,可以使用如下的命令:mcc-lmyfilename1.mmyfilename2.mmyfilename3.m-v生成的C共享库的名称为myfilename1.dll。2024/3/3(2)编写驱动程序调用MATLAB编译器生成的共享库的所有驱动程序一般都有类似的结构:声明变量,处理和验证输入参数。调用mclInitializeApplication函数来初始化MATLAB库。该函数用来设置全局MCR选项。在调用C共享库时,每一个库都有一个与之相对应的MCR示例。如果一个应用程序调用了两个MATLAB编译器产生的共享库,则会创建两个MCR实例。在用户创建第一个MCR实例前,必须调用mclInitializeApplication函数来设置MCR的选项,该函数将MCR选项应用于所有MCR实例。每个库调用一次<libname>Initialize函数,来创建库所需要的MCR实例。该函数执行库的初始化工作,例如:释放CTF文档,启动MCR实例等。调用每个库的输出函数,使用C-MexAPI函数来处理函数的输入和输出参数。2024/3/3当应用程序不再需要调用指定的库函数时,调用每个库的<libname>Terminate函数,来销毁相关的MCR实例,释放与MCR相关的资源。一旦一个库被终止,则该库的输出函数在应用程序中就不能被再调用。当应用程序不再需要调用任何库时,调用mclTerminateApplication函数。该函数释放MCR实例所使用的应用程序级别的资源。该函数被调用后,应用程序就不能再使用任何库了。清除变量,关闭文件,等等,并退出应用程序。3.编写驱动程序要编译驱动程序,使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论