主要内容

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

限制

打包 MATLAB 和工具箱

MATLAB® Compiler SDK™ 支持完整的 MATLAB 语言和几乎所有基于 MATLAB 工具箱,但以下情况除外:

  • MATLAB 及其配套工具箱中包含大多数预建的图形用户界面。

  • 不能从命令行直接从调用的功能。

编译的应用程序只能在运行 MATLAB 的操作系统上运行。但是,MATLAB Compiler SDK 生成的组件不能在 MATLAB 中使用。此外,由于 MATLAB Runtime 与 MATLAB 大小大致相同,使用 MATLAB Compiler SDK 构建的应用程序需要特定的存储内存和 RAM 才能运行。有关系统要求的最新信息,请参阅 MATLAB 系统要求

有关多平台兼容性的信息,请参阅确保编译应用程序的多平台兼容性

要查看 MATLAB Compiler SDK 限制的完整列表,请访问:https://www.mathworks.com/products/compiler/compiler_support.html ://www.mathworks.com/products/compiler/compiler_support.html。

注意

有关 MATLAB Compiler SDK 不支持的函数列表,请参阅MATLAB Compiler 和 MATLAB Compiler SDK 不支持进行编译的函数

由于缺少函数导致的回调问题

MATLAB Compiler SDK 创建应用程序时,它会打包您指定的 MATLAB 文件。此外,它还包括您的打包 MATLAB 文件调用的任何其他 MATLAB 文件。MATLABMATLAB Compiler SDK 使用依赖关系分析函数来确定所提供的 MATLAB 文件、MEX 文件和 P 文件所依赖的所有函数。

注意

如果与 p 文件关联的 MATLAB 文件不可用,依赖关系分析无法发现 p 文件依赖关系。

如果 MATLAB 文件中调用该函数的唯一位置是在以下任一位置对该函数的调用,则依赖关系分析无法定位该函数:

  • 回调字符串

  • 字符数组作为参量传递给 feval 函数或 ODE 求解器

    提示

    依赖函数也可以在由编译应用程序加载的 .mat 文件中隐藏,从而避免在依赖关系分析过程中出现。使用 mcc -a 参量或 %#function pragma 来识别 .mat 命令支持的 load 文件类或函数。

MATLAB Compiler SDK 不会在这些文本字符数组中查找要打包的函数名称。

症状

您的应用程序可以运行,但是交互式用户界面元素(例如按钮)却不起作用。编译后的应用程序发出以下错误消息:

An error occurred in the callback: change_colormap 
The error message caught was    : Reference to unknown function 
                change_colormap from FEVAL in stand-alone mode. 

解决方法

有多种方法可以消除此错误:

  • 使用 %#functionpragma 并将回调指定为字符数组

  • 使用函数句柄指定回调

  • 编译器自定义需求区域中包含 MATLAB 函数,使用 compiler.build 函数使用 AdditionalFiles 选项,或使用 mcc 使用 -a 标志。

将回调指定为字符数组.  创建仅在回调字符数组中指定的所有函数的列表,并使用单独的 %#function pragma 语句传递这些函数。这将覆盖产品依赖关系分析并指示它明确包含 %#function 指令中列出的函数。

例如,示例应用程序 change_colormap 中对 my_test 函数的调用说明了这个问题。为了确保 MATLAB Compiler SDK 处理 change_colormap MATLAB 文件,请在 %#function pragma 中列出函数名称。

function my_test()
% Graphics library callback test application

%#function change_colormap

peaks;

p_btn = uicontrol(gcf,...
                 'Style', 'pushbutton',...
                 'Position',[10 10 133 25 ],...
                 'String', 'Make Black & White',...
                 'CallBack','change_colormap');

使用函数句柄指定回调.  要使用函数句柄指定回调,请使用与上例相同的代码,并将最后一行替换为:

'CallBack',@change_colormap);

有关指定回调值的详细信息,请参阅 MATLAB 编程基础文档。

MATLAB 文件中查找缺失的函数

要查找应用程序中需要在 %#function pragma 中列出的函数,请在 MATLAB 文件源代码中搜索指定为回调字符数组或 fevalfminbndfminsearchfunmfzero 函数或任何 ODE 求解器的参量的文本。

要查找用作回调字符数组的文本,请在 MATLAB 文件中搜索字符“Callback”或“fcn”。此搜索查找图形对象定义的所有 Callback 属性,例如 uicontroluimenu。此外,它还会查找以 Fcn 结尾的图形和轴的属性,例如 CloseRequestFcn,这些属性也支持回调。

UNIX 系统上隐藏警告

在 UNIX® 系统上运行独立应用程序时可能会出现一些警告。

要抑制 libjvm.so 警告,请为您的平台正确设置动态库路径。有关详细信息,请参阅针对部署设置 MATLAB Runtime 路径

如果应用程序无需 Java® 即可运行,您还可以使用编译器选项 -R -nojvm 来设置应用程序的 nojvm Runtime 选项。

无法使用带有 -nojvm 选项的图形

如果您的程序使用图形并且使用 -nojvm 选项进行编译,则会遇到运行时错误。

无法创建输出文件

如果您收到此错误,则有几种可能的原因需要考虑。

Can't create the output file filename

可能的原因包括:

  • MATLAB Compiler SDK 尝试写入文件的文件夹(很可能是当前工作文件夹)缺少写入权限。

  • MATLAB Compiler SDK 尝试写入文件的文件夹(很可能是当前工作文件夹)中缺少可用磁盘空间。

  • 如果您正在创建一个独立的应用程序并对其进行了测试,则可能有一个进程正在运行并阻止 MATLAB Compiler SDK 新版本覆盖它。

没有针对封装函数的 MATLAB 文件帮助

如果您创建一个带有自文档在线帮助的 MATLAB 文件并将其打包,则以下命令的结果将难以理解:

help filename

注意

出于性能原因,MATLAB 文件注释在 MATLAB Runtime 加密之前被删除。

Mac OS X 不支持对 MATLAB Runtime 进行版本控制

MATLAB Mac OS X 不支持在同一台计算机上安装多个版本的 Runtime 的功能。当您收到新版本的 MATLAB 时,您必须重新编译并重新部署所有应用程序和组件。此外,当您在目标计算机上安装新版本的 MATLAB Runtime 时,必须先删除旧版本的 MATLAB Runtime,然后再安装新版本。目标计算机上只能有一个版本的 MATLAB Runtime

较旧的神经网络无法使用 MATLAB Compiler 部署

加载从旧版 Deep Learning Toolbox™ 保存的网络需要一些不可部署的初始化例程。因此,如果不先更新,就无法部署这些网络。

例如,使用 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

封装模式下使用多个参量调用 PRINTDLG 的限制

在编译模式下,调用 MATLAB printdlg 函数时只能有一个参量(例如, printdlg(gcf))。

当您使用多个参量调用 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 选项,或使用 -a mcc 标志。然后您可以使用 which 函数找到该文件。

有关在应用程序中包含数据文件的详细信息,请参阅在打包的应用程序中包含和访问文件

使用 C++ SetData 动态调整 mwArray 大小的限制

您不能使用 C++ SetData 方法动态调整 mwArray 的大小。

例如,如果您使用以下数组:

[1 2 3 4]

不能使用 SetData 将数组的大小增加到五个元素的长度。

打包时可接受的文件类型

使用部署 App 进行打包的有效和无效文件类型如下。

目标应用程序有效文件类型无效的文件类型

独立应用程序

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 文件可以是依赖文件。

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

另请参阅

主题