主要内容

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

测试失败

R2026b

成功编译应用程序后,下一步是在开发计算机上测试它,并将其部署到目标计算机上。目标计算机需要安装 MATLAB® Runtime。使用 compiler.package.installer 或编译器 App 打包的安装程序包含应用程序运行所需的所有文件,包括可执行文件、可部署存档和 MATLAB 运行时。

有关特定应用程序类型和平台的分发内容的信息,请参阅将 MATLAB Compiler SDK 文件分发给应用程序开发人员。

通过针对 MATLAB Compiler SDK™ 附带的 MATLAB Runtime 运行该应用程序,在开发计算机上测试该应用程序。这将验证库依赖关系是否正确、可部署存档是否可以提取以及应用程序所需的所有 MATLAB 代码、MEX 文件和支持文件是否已包含在存档中。如果您在测试应用程序时遇到错误,以下问题可能会帮助您找出问题所在。

在开发计算机上,通过在 MATLAB 提示符下发出 !application-name 测试应用程序的执行。如果您的应用程序在 MATLAB 环境中执行但无法从外部执行,这可能表明系统库路径存在问题,具体取决于您的平台,可能是以下环境变量之一:

  • PATH

  • LD_LIBRARY_PATH

  • DYLD_LIBRARY_PATH

有关设置系统库路径的详细信息,请参阅为部署设置 MATLAB Runtime 库路径。

确保在编译应用程序时包含了所有必要的文件(有关更多详细信息,请参阅编译生成的 readme.txt 文件)。

从主 MATLAB 文件调用的函数将自动由 MATLAB Compiler SDK 包含,就像使用 %#function pragma 包含的函数一样。但是,未明确调用的函数(例如通过 EVAL)需要在编译时使用 -a 命令的 mcc 开关来包含。此外,任何支持文件(例如 .mat,.txt 或 .html 文件)都需要使用 -a 开关添加到存档中。有关详细信息,请参阅在打包的应用程序中包含和访问文件。

MATLAB 及其相关工具箱的可编译功能存在限制。检查文档以查看应用程序的 MATLAB 文件中使用的函数是否有效。检查开发计算机上的文件 mccExcludedFiles.log。该文件列出了您的应用程序调用的所有无法编译的函数。

使用 MATLAB Compiler SDK 组件生成的可执行文件旨在安装多个版本的 MATLAB 的环境中运行。一些旧版本的 MATLAB 可能与此架构不完全兼容。

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

类似地,在 UNIX® 上,确保动态库路径(Linux® 上为 LD_LIBRARY_PATH)匹配。通过比较 MATLAB 提示符下的 !printenv 和 shell 提示符下的 printenv 的输出来执行此操作。使用此路径允许您从操作系统命令行使用 mcc。

任何部署目标所需的所有运行时库都包含在 MATLAB Runtime 中。有关安装 MATLAB Runtime 的信息,请参阅下载并安装 MATLAB Runtime。

错误消息表明缺少 DLL(例如 mclmcrrtX_XX.dll 或 mclmcrrtX_XX.so 通常是由 MATLAB Runtime 安装不正确引起的。有关安装 MATLAB Runtime 的信息,请参阅下载并安装 MATLAB Runtime。

MATLAB Runtime 也可能安装正确,但 PATH、LD_LIBRARY_PATH 或 DYLD_LIBRARY_PATH 变量设置不正确。有关设置环境变量的信息,请参阅为部署设置 MATLAB Runtime 库路径。

小心

不要通过移动 MATLAB Runtime 文件夹结构内的库或其他文件来解决这些问题。MATLAB Runtime 系统设计用于适应在同一台计算机上运行的不同 MATLAB Runtime 版本。文件夹结构是此功能的重要组成部分。

调用 MATLAB Compiler SDK 生成的共享库除了库调用本身之外,还需要正确的初始化和终止。有关调用共享库的信息,请参阅从 C/C++ 调用 MATLAB Compiler SDK API 函数。

为避免运行时出现错误,需要考虑的一些关键点:

  • 确保对 mclinitializeApplication 和 libnameInitialize 的调用成功。第一个函数可以构造 MATLAB Runtime 实例。第二个创建名为 libname 的库所需的 MATLAB Runtime 实例。如果这些调用不成功,您的应用程序将无法执行。

  • 在调用 mw- 之前请勿使用任何 mx- 或 mclinitializeApplication 函数。这包括在程序启动时初始化的静态变量和全局变量。初始化之前引用 mw- 或 mx- 函数会导致未定义的行为。

  • 使用 mclinitializeApplication 终止它之后,不要重新初始化(调用 mclTerminateApplication)。mclinitializeApplication 和 libnameInitialize 函数应该只调用一次。

  • 确保在 mclTerminateApplication 之后没有任何库调用。

  • 确保您使用正确的语法来调用库及其函数。