Main Content

部署生成的代码

部署是指在 MATLAB® 环境之外运行的应用程序中使用生成的代码的过程。许多主题和注意事项都与部署过程相关。

主函数

要创建应用程序,请创建或使用 C/C++ 主函数来调用从 MATLAB 函数生成的 C/C++ 入口函数。主函数指定 MATLAB 算法未指定的输入、输出和其他功能。默认情况下,代码生成器生成示例主函数。使用生成的示例主函数作为创建新主函数的起点。示例主函数清晰地展示了如何向生成的代码传递输入和从生成的代码传递输出。有关详细信息和示例,请参阅:

除了 C/C++ 入口函数之外,C/C++ 代码还必须调用生成的初始化函数和终止函数。默认情况下,生成的 C/C++ 入口函数调用初始化函数。生成的示例主函数调用终止函数。当您创建和编辑自己的主函数时,请确保同时调用初始化函数和终止函数。有关详细信息,请参阅:

生成的函数接口

要编写主函数,您必须熟悉生成的函数接口。

数据类型

生成的 C/C++ 函数原型使用的数据类型对应于您在 MATLAB 代码中使用的类型。请参阅将 MATLAB 类型映射到生成的代码中的类型。使用 Embedded Coder®,您可以自定义生成的数据类型的外观和样式。请参阅代码外观 (Embedded Coder)

参量传递行为

MATLAB Coder™ 生成的 C/C++ 入口函数遵循以下约定:

  • 按引用传递输入数组。

  • 按引用返回输出数组。

  • 按值传递输入标量。

  • 对单输出函数按值返回标量。

  • 按引用返回标量:

    • 适用于具有多个输出的函数。

    • 适用于使用相同的变量作为输入和输出的情况。

如果在 MATLAB 代码中使用相同的变量作为输入和输出,生成的代码将按引用传递标量。请参阅Avoid Data Copies of Function Inputs in Generated Code

数组定义

在生成的 C/C++ 代码中,固定大小和可变大小数组由不同数据类型表示。有关详细信息,请参阅在生成的函数接口中使用 C 数组

可执行的应用程序

在生成代码并编写使用生成代码的主文件后,您必须使用 MATLAB Coder 或其他编译工具将代码编译为可执行文件。您可能希望在您的 MATLAB 平台(主机平台)或不同平台(目标平台)上运行可执行应用程序。要将生成代码的必需元素打包到可导出的 zip 文件中以便手动传输到目标平台,请使用 packNGo 函数。

代码生成文件夹不一定包含生成的代码使用的所有文件。该文件夹还可以包含生成的代码不使用的支持文件。请使用 packNGo 打包和移动生成的代码文件,而不是移动和包含整个代码生成文件夹的内容。

二进制文件部署

您可以使用 codegen 命令或 MATLAB Coder 并选择静态库、动态库或可执行文件(lib、dll 或 exe)作为编译类型,直接生成二进制文件。默认情况下,生成的二进制文件适用于主机平台硬件和操作系统。要编译可执行文件,您必须指定或提供主文件。有关示例,请参阅 从 MATLAB 代码生成独立的 C/C++ 可执行文件。如果将配置对象的 GenerateExampleMain 属性设置为 'GenerateCodeAndCompile',代码生成器将使用生成的示例主文件编译可执行文件。

如果您要将代码部署到另一个平台上,则您可以使用支持为该平台生成和编译二进制代码的硬件支持包。这种支持包括目标硬件所需的特定工具链和代码生成配置设置。有关为 MATLAB Coder 提供的支持包列表,请参阅 MATLAB Coder 支持的硬件。有许多附加硬件支持包可用于 Embedded Coder。请参阅 Embedded Coder 支持的硬件 (Embedded Coder)。如果要为硬件支持包中不可用的编译指定自定义工具链,您可以注册自己的工具链。请参阅自定义工具链注册

MATLAB Coder 中,在生成代码步骤中,从硬件板下拉列表中选择一个硬件支持包。在命令行中,使用 coder.hardware 函数指定硬件支持包。

源代码部署

在某些情况下,您可以选择生成源代码,然后手动为工程编译源代码。在以下情况下,可手动编译源代码:

  • 生成的源代码易于编译。例如,生成的代码不需要链接其他库。

  • 要为没有硬件支持包的自定义硬件创建可执行文件。

  • 您熟悉 C/C++ 源代码的编译,或目标平台的编译系统已配置好。

代码生成器会生成一个 buildInfo 对象,该对象使您能够查看和修改 MATLAB Coder 用于创建二进制文件输出的编译信息。您可以使用这些信息来了解如何手动编译您生成的代码。请参阅 Build Process CustomizationRTW.BuildInfo (Embedded Coder)

代码生成器会生成一个联编文件,该联编文件显示编译和链接标志等编译信息。在代码生成文件夹中可找到此联编文件。如果没有指定硬件支持包,则生成的联编文件将特定于您通过选择硬件支持包或主机平台指定的目标平台。如果您手动编译源代码,则可以使用此联编文件来识别编译需求并进行故障排除,例如编译和链接标志。

要了解如何为目标平台手动配置代码生成和编译,请参阅Deploy Generated C Code to External Hardware: Raspberry Pi Examples

静态和动态库

当您要在现有 C/C++ 工程中使用生成的代码功能时,可以生成静态库或动态库。库可以提供比生成的源代码更模块化的接口。当 MATLAB Coder 生成静态库或动态库时:

  • 库适用于您正在使用的平台,除非您通过硬件支持包指定替代平台。

  • 为 C 代码生成的头文件将导出的函数显式声明为 extern "C",以简化库与 C++ 应用程序的集成。

  • 生成的库文件扩展名对应于 MATLAB 主机平台操作系统。

    操作系统静态库动态库
    Windows®.lib对应导入库的 .dll.lib
    macOS.a.dylib
    Linux®.a.so

当您编译可执行文件时,必须编译和链接库。当使用动态库的可执行文件运行时,该动态库必须位于系统路径上或在可执行文件的文件夹中。有关使用生成的库的示例,请参阅:

不推荐使用 loadlibrary 函数将生成的动态库加载到 MATLAB 中,因为这可能导致不正确的行为或导致系统崩溃。

生成的文件结构

默认情况下,MATLAB Coder 为每个 MATLAB 代码文件生成一个 C 代码文件。您可以选择将生成的代码划分到单个文件中,并使用自定义的输出文件夹和二进制文件名称生成代码。请参阅How MATLAB Coder Partitions Generated Code

使用 Embedded Coder,您可以自定义生成的文件名。请参阅Customize C/C++ File Names Generated from MATLAB Code (Embedded Coder)

代码验证

在部署生成的代码以在 MATLAB 环境之外执行之前,您可以在 MATLAB 环境内对生成的代码进行验证。使用 MATLAB Coder 进行验证的主要工作流是生成和执行 C/C++ MEX 函数。MEX 函数在 MATLAB 环境中运行,并提供运行时错误检查和诊断。请参阅代码验证

Embedded Coder 可为代码验证和测试提供其他更深入的功能。您可以使用软件在环 (SIL) 和处理器在环 (PIL) 执行来测试生成的代码在 MATLAB 环境之外的软件和硬件上的行为。请参阅验证 (Embedded Coder)

自定义硬件注意事项

如果您的目标仅支持 single 数据类型而不支持 double 数据类型,则可以使用 codegen -singleC 选项生成单精度代码。此选项需要 Fixed-Point Designer™。如果您的目标仅支持整数数据类型,请使用 -float2fixed 选项。请参阅 codegen

其他部署策略

MATLAB Coder 为部分 MATLAB 语言生成可读且可移植的 C/C++ 代码。如果您要为使用 MATLAB Runtime 库的主机平台生成独立的可执行应用程序,但无需 MATLAB 许可证即可运行,请使用 MATLAB Compiler SDK™。有关产品比较,请参阅 https://www.mathworks.com/matlabcentral/answers/223937-should-i-use-matlab-compiler-sdk-or-matlab-coder-to-deploy-my-matlab-programs

另请参阅

|

相关主题

外部网站