MATLAB Compiler 的限制
本主题介绍了在使用 MATLAB® Compiler™ 和 MATLAB Runtime 时需要考虑的限制,包括打包限制及其他限制。
要查看 MATLAB Compiler 限制的完整列表,请访问:https://www.mathworks.com/products/compiler/compiler_support.html ://www.mathworks.com/products/compiler/compiler_support.html。
打包 MATLAB 和工具箱
MATLAB Compiler 支持几乎完整的 MATLAB 语言以及基于 MATLAB 的工具箱,但以下情况除外:
MATLAB 及其配套工具箱中包含的大多数预构建图形用户界面
无法直接从命令行调用的功能
有关 MATLAB Compiler 不支持的功能列表,请参阅 MATLAB Compiler 和 MATLAB Compiler SDK 不支持进行编译的函数。
编译的应用程序只能在运行 MATLAB 的操作系统上运行。此外,由于 MATLAB Runtime 的大小与 MATLAB 大致相当,因此使用 MATLAB Compiler 构建的应用程序需要特定的存储空间和内存才能运行。有关系统要求的最新信息,请参阅 MATLAB 系统要求。
有关多平台部署的指南,请参阅 确保编译应用程序的多平台兼容性 (MATLAB Compiler SDK)。
MATLAB Compiler 生成的组件
由 MATLAB Compiler SDK™ 或 MATLAB Compiler 生成的组件旨在与 MATLAB Runtime 一起部署,无法直接在 MATLAB 中使用。您可以使用 system 命令或感叹号运算符,在 MATLAB 中测试生成的独立应用程序。有关在 MATLAB 中测试应用程序的更多信息,请参阅 设置 MATLAB 库路径以测试已部署的应用程序。
较旧的神经网络无法使用 MATLAB Compiler 部署
加载使用旧版本 Deep Learning Toolbox™ 创建的神经网络需要一些初始化例程,而这些例程无法与 MATLAB Compiler 一起部署。因此,在部署之前,您需要先更新网络。
例如,部署一个使用 Deep Learning Toolbox 5.0.1 版(2006b)和 MATLAB Compiler 4.5 版(R2006b)创建的网络时,运行时会出现以下错误:
??? Error using ==> network.subsasgn
"layers{1}.initFcn" cannot be set to non-existing
function "initwb".
Error in ==> updatenet at 40
Error in ==> network.loadobj at 10
??? Undefined function or method 'sim' for input
arguments of type 'struct'.
Error in ==> mynetworkapp at 30并行池的限制
部署的应用程序若使用共享的 MATLAB Runtime 实例或单一运行时,则不能使用多个并行池。若要使用多个并行池,请重构代码以创建多个 MATLAB Runtime 进程。
在以 MATLABApplicationMode::OUT_OF_PROCESS 模式运行的、使用 MATLAB Data API 接口的 MATLAB Compiler SDK C++ 共享库中,不支持 Parallel Computing Toolbox™ 功能。
封装模式下使用多个参量调用 PRINTDLG 的限制
当代码以部署模式运行时,调用 MATLAB printdlg 函数(例如 printdlg(gcf))时,只能包含一个参量。
如果您在 MATLAB 中向 printdlg 传递多个参量,系统不会报错。但是,如果您部署了一个包含多参量调用的编译后应用程序,该操作将失败,并且软件会显示以下错误消息:
Error using = => printdlg at 11 PRINTDLG requires exactly one argument
使用 which 和 open 打开文件不搜索当前工作文件夹
如下例所示,在部署的应用程序中使用 which 函数不会导致搜索当前文件夹。此外,使用此函数可能会导致 open 函数出现不可预测的行为。
function pathtest
which myFile.mat
open('myFile.mat') 使用以下解决方案之一作为替代方案:
请使用
load或针对特定文件类型的专用函数。load会明确检查当前文件夹中的文件。load myFile.mat
使用
ctfroot函数明确指向相对于可部署存档的文件位置。load(fullfile(ctfroot,'..','datafiles','data1.mat'));
请通过以下任一方式包含该文件:在编译器应用程序的运行应用程序所需的文件区域中,
compiler.build函数的AdditionalFiles选项中,或mcc的-a标志中。然后您可以使用which函数找到该文件。
有关在应用程序中包含数据文件的详细信息,请参阅在打包的应用程序中包含和访问文件。
在 UNIX 系统上抑制警告
在 UNIX® 系统上运行独立应用程序时可能会出现一些警告。
要抑制 libjvm.so 警告,请为您的平台正确设置动态库路径。有关详细信息,请参阅为部署设置 MATLAB Runtime 库路径。
如果应用程序能够在不使用 Java® 的情况下运行,您也可以使用编译器选项 -R -nojvm 来设置应用程序的 nojvm 运行时选项。
如果您的应用程序包含图形元素,且使用 -nojvm 选项进行编译,将会引发运行时错误。
没有针对封装函数的 MATLAB 文件帮助
如果您创建了一个带有自文档式在线帮助的 MATLAB 函数,然后将其打包,那么以下命令的输出结果将难以理解:
help filename
注意
出于性能考虑,在 MATLAB Runtime 加密之前,会移除 MATLAB 文件注释。
使用 C++ 的 SetData 动态调整大小 mwArray
您无法使用 C++ 的 SetData 方法来动态调整 mwArray 的大小。
例如,如果您正在处理以下数组,则无法使用 SetData 将其大小扩展为包含五个元素。
[1 2 3 4]
打包时可接受的文件类型
下表列出了使用部署应用进行打包时,哪些文件类型有效,哪些无效。
| 目标应用程序 | 有效文件类型 | 无效的文件类型 |
|---|---|---|
独立应用程序 | MATLAB MEX 文件、MATLAB 脚本、MATLAB 函数和 MATLAB 类文件。这些文件必须有一个单一的入口点。 | 受保护的函数文件( |
C/C++ 共享库、.NET 程序集、Java 类、Python® 包和 COM 组件 | MATLAB MEX 文件、MATLAB 函数和 MATLAB 类文件。这些文件必须有一个单一的入口点。 | MATLAB 脚本、受保护的函数文件( |
MATLAB 生产服务器存档 | MATLAB MEX 文件和 MATLAB 函数。这些文件必须有一个单一的入口点。 | MATLAB 脚本、MATLAB 类文件、受保护的函数文件( |
您可以将其他类型的文件添加到打包的代码存档中,例如数据文件。有关详细信息,请参阅在打包的应用程序中包含和访问文件。