限制
打包 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.
解决方法
有多种方法可以消除此错误:
使用
%#function
pragma
并将回调指定为字符数组使用函数句柄指定回调
在编译器的自定义需求区域中包含 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 文件源代码中搜索指定为回调字符数组或 feval
、fminbnd
、fminsearch
、funm
和 fzero
函数或任何 ODE 求解器的参量的文本。
要查找用作回调字符数组的文本,请在 MATLAB 文件中搜索字符“Callback”或“fcn”。此搜索查找图形对象定义的所有 Callback
属性,例如 uicontrol
和 uimenu
。此外,它还会查找以 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
使用 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
选项,或使用-a
的mcc
标志。然后您可以使用which
函数找到该文件。
有关在应用程序中包含数据文件的详细信息,请参阅在打包的应用程序中包含和访问文件。
使用 C++ SetData 动态调整 mwArray 大小的限制
您不能使用 C++ SetData
方法动态调整 mwArray
的大小。
例如,如果您使用以下数组:
[1 2 3 4]
不能使用 SetData
将数组的大小增加到五个元素的长度。
打包时可接受的文件类型
使用部署 App 进行打包的有效和无效文件类型如下。
目标应用程序 | 有效文件类型 | 无效的文件类型 |
---|---|---|
独立应用程序 | MATLAB MEX 文件、MATLAB 脚本、MATLAB 函数和 MATLAB 类文件。这些文件必须有一个单一的入口点。 | 受保护的函数文件( |
C/C++ 共享库、.NET 程序集、Java 类、Python® 包和 COM 组件 | MATLAB MEX 文件、MATLAB 函数和 MATLAB 类文件。这些文件必须有一个单一的入口点。 | MATLAB 脚本、受保护的函数文件( |
MATLAB 生产服务器存档 | MATLAB MEX 文件和 MATLAB 函数。这些文件必须有一个单一的入口点。 | MATLAB 脚本、MATLAB 类文件、受保护的函数文件( |
您可以将其他类型的文件添加到打包的代码存档中,例如数据文件。有关详细信息,请参阅在打包的应用程序中包含和访问文件。