主要内容

本页采用了机器翻译。点击此处可查看英文原文。

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 

使用 whichopen 打开文件不搜索当前工作文件夹

如下例所示,在部署的应用程序中使用 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 类文件。这些文件必须有一个单一的入口点。

受保护的函数文件(.p 文件)、Java 函数、COM 或 .NET 组件和数据文件。

C/C++ 共享库、.NET 程序集、Java 类、Python® 包和 COM 组件

MATLAB MEX 文件、MATLAB 函数和 MATLAB 类文件。这些文件必须有一个单一的入口点。

MATLAB 脚本、受保护的函数文件(.p 文件)、Java 函数、COM 或 .NET 组件以及数据文件。

MATLAB 生产服务器存档

MATLAB MEX 文件和 MATLAB 函数。这些文件必须有一个单一的入口点。

MATLAB 脚本、MATLAB 类文件、受保护的函数文件(.p 文件)、Java 函数、COM 或 .NET 组件和数据文件。MATLABMATLAB 文件可以是依赖文件。

您可以将其他类型的文件添加到打包的代码存档中,例如数据文件。有关详细信息,请参阅在打包的应用程序中包含和访问文件

另请参阅

主题