主要内容

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

排查已部署应用程序的故障

问题

在运行使用 MATLAB® Compiler™ 创建的应用程序时遇到的错误,可能表明 MATLAB 代码的编译或部署环境存在问题。有关应用程序部署的概述,请参阅 使用 MATLAB Compiler 进行部署的步骤

可能的解决方案

编译应用程序后,请在开发计算机上使用与创建该应用程序时相同的 MATLAB 版本对应用程序进行测试。如果您的应用程序仅在 MATLAB 内运行,则系统库路径可能未正确设置。有关详细信息,请参阅 设置 MATLAB 库路径以测试已部署的应用程序

如果应用程序在测试计算机上运行正常,您就可以定位最终用户部署中的故障。通常,目标计算机没有安装 MATLAB,需要安装 MATLAB Runtime。有关详细信息,请参阅 关于 MATLAB Runtime

解决错误:缺少 DLL

提示缺少 DLL 文件的消息(例如 mclmcrrtX_XX.dllmclmcrrtX_XX.so)通常是由 MATLAB Runtime 安装不正确引起的。有关安装 MATLAB Runtime 的信息,请参阅下载并安装 MATLAB Runtime

有时,您可能会遇到 MATLAB Runtime 和 Microsoft® Windows® 均包含的某个 DLL 文件版本不匹配的情况。您可以使用 Process Monitor 工具来调查应用程序调用了哪些 DLL。有关在已部署的应用程序中使用 Process Monitor 的信息,请参阅如何使用 Process Monitor 排查程序执行中的问题?

另一种可能是 MATLAB Runtime 已正确安装,但系统库路径设置有误。有关安装 MATLAB Runtime 后在部署计算机上设置路径的信息,请参阅为部署设置 MATLAB Runtime 库路径

小心

请勿移动 MATLAB Runtime 文件夹结构内的库文件或其他文件。MATLAB Runtime 系统设计用于适应在同一台计算机上运行的不同 MATLAB Runtime 版本。文件夹结构是该设计的重要组成部分。

检查被排除的文件和函数

MATLAB Compiler 使用了一个依赖关系分析函数,该函数可确定所提供的 MATLAB 文件、MEX 文件和 P 文件所依赖的所有文件和函数。

应用程序代码中未显式调用的函数,必须在编译时通过以下任一方式包含:%#function 指令、compiler.build 函数(如 compiler.build.standaloneApplication)的 AdditionalFiles 属性,或 mcc -a 选项。如果与某个 p-file 关联的 MATLAB 文件不可用,依赖关系分析过程将无法发现该 p-file 的依赖关系。此外,您必须手动添加支持文件,例如 .mat.txt.html 文件。有关详细信息,请参阅 在打包的应用程序中包含和访问文件

要查找应用程序中需要列入 %#function 指令中的函数,请在 MATLAB 文件的源代码中搜索以下内容:作为回调字符数组定义的文本,或作为函数 fevalfminbndfminsearchfunmfzero 以及任何常微分方程求解器的参量出现的文本。

MATLAB 及其相关工具箱在可编译的功能方面存在限制。有关详细信息,请参阅 MATLAB Compiler 的限制。请确保应用程序中 MATLAB 代码所使用的函数是有效的。检查开发计算机上的文件 mccExcludedFiles.log。该文件列出了您的应用程序调用的所有无法编译的函数。

解决错误:回调中存在未知函数

如果依赖关系分析过程无法包含回调中使用的某个函数,您的编译后应用程序可能无法正常运行,或者可能会显示类似以下示例的消息。

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. 

依赖关系分析过程无法发现位于以下任一位置的函数调用:

  • 回调字符串

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

    提示

    依赖函数也可以在由编译应用程序加载的 .mat 文件中隐藏,从而避免在依赖关系分析过程中出现。您可能需要手动包含由 load 命令支持的 .mat 文件中的类或函数。

对于已部署的代码,请将回调函数指定为字符数组或函数句柄。

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

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

例如,示例应用程序 change_colormap 中对 my_test 函数的调用说明了这个问题。为了确保 MATLAB Compiler 处理 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 代码,从而导致应用程序运行失败。如果应用程序对安装文件夹具有写入访问权限,则在首次运行应用程序时,软件会创建一个名为 application-name_mcr 的子文件夹。创建此子文件夹后,应用程序不再需要写访问权限才能进行后续执行。

解决错误:无法创建输出文件

如果您收到以下错误提示,可能有以下几种原因需要考虑。

Can't create the output file filename

可能的解决方案包括:

  • 获取 MATLAB Compiler 试图写入文件的文件夹的写入权限(很可能是当前文件夹)。

  • 请为 MATLAB Compiler 尝试写入文件的文件夹(很可能是当前文件夹)清理磁盘空间。

  • 清除正在阻塞 MATLAB Compiler 的运行进程。如果您正在开发一个独立应用程序,并在同一台计算机上进行测试,那么某个正在运行的进程可能会阻止 MATLAB Compiler 将其覆盖为新版本。要结束该进程,请使用系统任务管理器关闭 MATLAB 的实例或相关应用程序。

使用多个 MATLAB 版本

MATLAB Compiler 生成的可执行文件旨在安装有多个版本 MATLAB 的环境中运行。某些旧版本的 MATLAB 可能与该架构不完全兼容。

在 Windows 上,请确保您的计算机上的 PATH 环境变量中,您正在编译的 matlabroot\runtime\win64 MATLAB 版本的路径位于计算机上已安装的其他 MATLAB 版本路径之前。

同样,在 UNIX® 系统上,请确保动态库路径一致。要做到这一点,请比较在 MATLAB 提示符下 !printenv 的输出结果,以及在 shell 提示符下 printenv 的输出结果。有关详细信息,请参阅为部署设置 MATLAB Runtime 库路径

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

部署新版本的应用程序

在部署可执行文件的新版本时,必须重新部署该可执行文件,因为它还包含嵌入的可部署代码存档。可部署存档是特定编译会话的关键。每次重新编译应用程序时,软件都会生成一个新的、匹配的可部署存档。删除现有的应用程序文件夹并运行新的可执行文件,以确保应用程序可以扩展新的可部署存档。您必须具备写入访问权限才能解压新的可部署存档文件。

另请参阅

主题