主要内容

codegen

MATLAB 代码生成 C 或 C++ 代码

说明

codegen fun 使用默认代码生成设置为 MATLAB® 函数 fun 生成 C MEX 函数。如果 fun 不接受输入参量,或您在 MATLAB 函数体中使用 arguments 块或 assert 语句定义输入参量,则使用此语法。

示例

codegen options fun 使用您通过 options 参量指定的代码生成设置为 MATLAB 函数 fun 生成 C 或 C++ 代码。例如,使用 options 参量指定生成代码的语言(C 或 C++)或输出类型(静态库、动态库、可执行文件或 MEX 函数)。如果 fun 不接受输入参量,或您在 MATLAB 函数体中使用 arguments 块或 assert 语句定义输入参量,则使用此语法。

示例

codegen options fun -args inputs 使用在 options 参量中指定的代码生成设置为 MATLAB 函数 fun 生成 C/C++ 代码。使用 inputs 参量指定输入类型。

示例

codegen options fun -args inputs -nargout numOut 使用指定的代码生成设置、输入参量和输出参量数目 numOut 为 MATLAB 函数 fun 生成 C/C++ 代码。当您不想为所有 MATLAB 函数输出生成代码时,请使用此语法。如果 fun 使用 varargout,则必须指定 -nargout numOut

示例

codegen options advSyntax 为具有多个签名和支持文件的多个入口函数生成 C/C++ 代码。您也可以使用此语法为 MATLAB Coder™ 工程生成代码。

示例

示例

全部折叠

检查 MATLAB 函数 helloWorld。此函数不接受输入参量,它会输出一个介于 1 和 100 之间的随机整数。函数声明后的 %#codegen 指令提示 MATLAB 代码分析器识别特定于代码生成的警告和错误。

function out = helloWorld %#codegen
out = randi(100);
end

helloWorld MATLAB 函数生成 C MEX 函数。codegen 命令默认生成 C MEX 函数。

codegen helloWorld
Code generation successful.

在命令行中运行生成的 MEX 函数。该函数生成一个介于 1 和 100 之间的随机数。

helloWorld_mex
ans =

    91

检查 MATLAB 函数 myaddarg,该函数返回两个值之和。函数声明后的 %#codegen 指令提示 MATLAB 代码分析器识别特定于代码生成的警告和错误。此函数使用 arguments 块声明 u 是由双精度实数值组成的 1×4 行向量,v 是双精度实数标量。

function y = myaddarg(u,v) %#codegen
arguments
    u (1,4) double
    v (1,1) double
end
y = u + v;
end

myaddarg 函数生成独立的 C++ 静态库。使用 -config:lib 选项指定静态库,并使用 lang:c++ 选项指定 C++。代码生成器在文件夹 codegen/lib/myaddarg 中生成 C++ 源代码、库、对象和头文件。

codegen -config:lib -lang:c++ myaddarg
Code generation successful.

检查 MATLAB 函数 myadd,该函数返回两个值之和。函数声明后的 %#codegen 指令提示 MATLAB 代码分析器识别特定于代码生成的警告和错误。

function y = myadd(u,v) %#codegen
y = u + v;
end

在 MATLAB 命令行中,调用 codgen 命令。使用 -config:lib 选项生成静态库。默认情况下,代码生成器生成 C 代码。使用 -args 指定 myadd 函数接受两个输入参量,且这两个输入参量都是双精度标量。要了解有关在命令行中指定输入参量的更多信息,请参阅Specify Input Types at the Command Line

codegen -config:lib myadd -args {0,0}
Code generation successful.

检查生成的 C 文件中 myadd 的定义。代码生成器在文件夹 codegen/lib/myadd 中生成此文件。

/* Function Definitions */
/*
 * Arguments    : double u
 *                double v
 * Return Type  : double
 */
double myadd(double u, double v)
{
  return u + v;
}

检查函数 myops。此函数执行四种不同运算,可能有 1 到 4 个输出。函数声明后的 %#codegen 指令提示 MATLAB 代码分析器识别特定于代码生成的警告和错误。

function varargout = myops(a,b) %#codegen
varargout{1} = a+b;
varargout{2} = a*b;
varargout{3} = a/b;
varargout{4} = a-b;
end

myops MATLAB 函数生成 C MEX 函数。codegen 命令默认生成 C MEX 函数。使用 -args 指定输入参量:

  • 要指定 a 是最大长度为 10 的可变长度行向量,请使用 coder.typeof

  • 要指定 b 是双精度标量,请使用 0 作为示例值。

要了解有关在命令行中指定输入参量的更多信息,请参阅Specify Input Types at the Command Line

由于 myops 使用 varargout,您必须包含 -nargout 参量。使用 -nargout 3 指示代码生成器为前三个输出变量生成代码。要了解有关控制生成代码中输入或输出参量数目的更多信息,请参阅Specify Number of Input or Output Arguments to Entry-Point Functions

codegen myops -args {coder.typeof(0,[1 10],[false true]),0} -nargout 3
Code generation successful.

在命令行中使用三个输出的形式运行生成的 MEX 函数。生成的 MEX 函数正确生成输出。

[x,y,z] = myops_mex(3,4)
x =

     7


y =

    12


z =

    0.7500

在命令行中使用四个输出的形式运行生成的 MEX 函数。生成的 MEX 函数产生错误。

[x,y,z,a] = myops_mex(3,4)
Too many output arguments for entry-point 'myops'.

检查 MATLAB 函数 myAdd,该函数返回两个值之和。

function y = myAdd(u,v) %#codegen
y = u + v;
end

在 MATLAB 命令行中,调用 codgen 命令。使用 -config:lib 选项生成静态库,并使用 -lang:c++ 选项生成 C++ 代码。使用以下各项为 myadd 指定三组输入:

  • 使用 -args {0,0} 指定两个双精度标量

  • 使用 -args {int8(0),int8(0)} 指定两个 8 位有符号整数

  • 使用 -args {0,coder.typeof(0,[10,10]) 指定一个双精度标量和一个最大大小为 10×10 的可变大小数组

要了解有关在命令行中指定输入参量的更多信息,请参阅Specify Input Types at the Command Line

codegen -lang:c++ -config:lib myadd -args {0,0} -args {int8(0),int8(0)} -args {0,coder.typeof(0,[10,10])}
Code generation successful.

检查文件夹 codegen/lib/myadd 中生成的头文件 myadd.h。代码生成器声明 myadd 函数的三个版本,分别具有三组不同输入。

// Function Declarations
real_T myadd1(real_T u, real_T v);

int8_T myadd2(int8_T u, int8_T v);

void myadd3(real_T u, const real_T v[100], real_T y[100]);
有关详细信息,请参阅Generate Code for Functions with Multiple Signatures

检查 MATLAB 函数 myrand,该函数生成一个随机标量值。

function r = myrand() %#codegen
r = rand();
end

检查文件 main.c,其中包含 C 主函数。C 主函数调用从 myrand MATLAB 函数生成的 C 函数。

/* main.c */
#include <stdio.h>
#include <stdlib.h>
#include "myrand.h"
#include "myrand_initialize.h"
#include "myrand_terminate.h"
int main()
{
    myrand_initialize();
    printf("myrand value %g\n", myrand());
    myrand_terminate();
    return 0;
}

在 MATLAB 命令行中,调用 codgen 命令。使用 -config:exe 选项生成可执行文件。默认情况下,代码生成器生成 C 代码。指示代码生成器包含自定义源代码文件 main.c。代码生成器在工作文件夹中创建 C 可执行文件。

codegen -config:exe myrand main.c

使用 systemispc 函数测试生成的可执行文件。可执行文件产生预期的输出。

if ispc
    system("myrand.exe")
else
    system("./myrand")
end
myrand value 0.814724 

ans =

     0

有关更详细的示例,请参阅在应用程序中使用示例 C 主函数

输入参数

全部折叠

代码生成选项,指定为一个选项值或以空格分隔的选项值列表。您可以按任意顺序输入选项值。如果各选项之间发生冲突,则最右边的选项优先。

指定代码配置对象

要指定代码配置对象,请使用 -config 选项。您可以单独使用此对象,也可以与其他选项值结合使用。请参阅配置代码生成和编译设置。代码生成器优先使用您通过 codegen 函数指定的选项,而不是使用代码配置对象指定的选项。

选项值描述
-config configObject

指定包含代码生成设置的配置对象。要创建一个代码配置对象,请使用 coder.config 函数。例如,要为静态库创建一个代码配置对象,请使用以下命令:

cfg = coder.config("lib");
然后,将创建的对象传递给 codegen。例如:
codegen -config cfg foo

控制生成代码的语言

下表显示控制生成代码语言的选项。默认情况下,代码生成器生成与 C99 (ISO) 语言标准兼容的 C 代码。如果生成 C++ 代码,代码生成器默认生成与 C++11 (ISO) 语言标准兼容的 C++ 代码。

如果生成 C 代码,则不支持 C++ 语言标准。如果生成 C++ 代码,但指定 C 语言标准,则代码生成器使用在选定 C 标准中可用的 C 数学库和 C++03 语言功能。有关支持的语言标准的详细信息,请参阅更改用于代码生成的语言标准

选项值描述
-lang:c

生成 C 代码。

-lang:c++

生成 C++ 代码。

-std:c89/c90

生成与 C89/90 (ANSI) 语言标准兼容的代码。

-std:c99

生成与 C99 (ISO) 语言标准兼容的代码。当您生成 C 代码时,此语言标准是默认值。

-std:c++03

生成与 C++03 (ISO) 语言标准兼容的代码。

-std:c++11

生成与 C++11 (ISO) 语言标准兼容的代码。当您生成 C++ 代码时,此语言标准是默认值。

-std:c++14

生成与 C++14 (ISO) 语言标准兼容的代码。

-std:c++17

生成与 C++17 (ISO) 语言标准兼容的代码。

-std:c++20

生成与 C++20 (ISO) 语言标准兼容的代码。

控制输出类型

下表显示控制代码生成器生成的代码类型的选项。默认情况下,代码生成器生成 MEX 函数并编译生成代码。

选项值描述
-config:dll

生成动态 C/C++ 库。

-config:exe

生成 C/C++ 可执行文件。

-config:lib

生成静态 C/C++ 库。

-config:mex

生成 MEX 函数。

-c

仅生成源代码。代码生成器不调用 make 命令,也不编译目标代码。例如,要为函数 foo 生成静态 C 库并生成源代码而不编译生成代码,请使用以下命令:

codegen -config:lib -c foo

-jit

使用即时 (JIT) 编译生成 JIT MEX 函数,其中包含 MATLAB 代码的抽象表示。JIT 编译可以加速 MEX 函数的生成。您只能在生成 MEX 函数时使用此选项。此选项与某些代码生成选项(例如包含自定义代码或使用 OpenMP 库)不兼容。

请参阅使用 JIT 编译加速 MEX 生成

指定全局变量

使用 -globals 选项在命令行中指定全局变量。您也可以在 MATLAB 工作区中定义和初始化全局变量。请参阅Generate Code for Global Variables

选项值描述
-globals globalArray

定义并初始化在您为其生成代码的 MATLAB 函数中使用的全局变量。

globalArray 是全局变量名称和初始值组成的元胞数组。此元胞数组的格式为 {global1,value1,global2,value2,...}。例如:

codegen foo -globals {"A",ones(4),"B",[1 2 3]} -args {0}

或者,使用 coder.typeof 函数指定全局变量类型。在本例中,您传递给 -globals 选项的元胞数组的格式为 {global1,{type1,value1},global2,{type2,value2},...}。例如:

codegen foo -globals {"A",{coder.typeof(0,[4 4]),ones(4)}}

指定优化

下表显示在生成代码中指定优化的选项。有关可用于优化生成代码的其他策略,请参阅优化生成的 C/C++ 和 MEX 代码

选项值描述

-O enable:inline

-O disable:inline

启用或禁用生成代码中的函数内联。默认情况下,代码生成器使用内联。要了解有关函数内联的详细信息,请参阅Control Inlining to Fine-Tune Performance and Readability of Generated Code

始终对函数调用进行内联会使代码生成优化处理更多代码,因此可能会增加代码生成时间。

-O enable:openmp

-O disable:openmp

启用或禁用生成代码中 OpenMP 库的使用。如果启用此优化并且 OpenMP 库可用,则代码生成器会生成可在多个线程上运行的 parfor 循环。默认情况下,代码生成器使用 OpenMP 库(如果可用)。

如果禁用 OpenMP 优化或 OpenMP 库不可用,则代码生成器将 parfor 循环视为 for 循环,并生成在单个线程上运行的代码。

请参阅控制 parfor 循环的编译

-rowmajor

生成使用行优先数组布局的代码。默认情况下,代码生成器使用列优先数组布局。有关详细信息,请参阅Generate Code That Uses Row-Major Array Layout

指定调试选项

下表显示可用于调试生成代码和代码生成过程的选项。在生成独立代码或加速 MEX 函数之前,最佳做法是通过生成并运行 MEX 函数来检查 MATLAB 代码中的合规性问题。请参阅使用 MEX 函数检查 MATLAB 代码中的问题

选项值描述
-g

为 C/C++ 编译器启用调试模式。如果启用调试模式,代码生成器会禁用编译器使用的一些优化,这可以加快代码生成速度。但是,生成代码可能执行得更慢。

-profile

使用 MATLAB 探查器对生成的 MEX 函数进行探查。请参阅使用 MATLAB 探查器探查 MEX 函数

-report

生成代码生成报告。如果未指定此选项,则仅当出现错误或警告消息或者您指定了 -launchreport 选项时,codegen 才会生成报告。

如果您有 Embedded Coder®,则此选项还支持生成代码替换报告。

-reportinfo info

将有关代码生成的信息导出到 MATLAB 基础工作区的变量 info 中。请参阅Access Code Generation Report Information Programmatically

-silent启用此优化可在代码生成成功且没有警告时隐藏消息。此选项不会隐藏警告和错误消息。
-test testFile

运行 testFile 并将对原始 MATLAB 函数的调用替换为对 MEX 函数的调用。使用此选项等效于运行 coder.runTest

此选项仅在生成 MEX 函数时受支持。

如果您有 Embedded Coder 许可证,则在为软件在环 (SIL) 或处理器在环 (PIL) 验证生成代码时也可以使用此选项。请参阅Code Verification Through Software-in-the-Loop and Processor-in-the-Loop Execution (Embedded Coder)

-v

显示代码生成状态和目标编译日志消息。

控制生成文件的名称和位置

下表显示可用于更改代码生成器生成的文件的默认基本名称和位置的选项。

选项值描述
-d folder

将生成的文件存储在 folder 指定的绝对或相对路径中。文件夹名称不能包含:

  • 空格,在某些操作系统配置中,空格可能会导致代码生成失败

  • 非 7 位 ASCII 字符,例如日语字符

  • 星号 (*)、问号 (?)、美元符号 ($) 或井号 (#)

如果 folder 指定的文件夹不存在,代码生成器会创建它。

-o basename

生成基本名称为 basename 的 MEX、库和可执行文件。基本名称不能包含空格,因为在某些操作系统配置中,空格可能会导致代码生成失败。如果生成 MEX 函数,则 basename 必须为有效的 MATLAB 函数名称。

修改代码生成路径

使用 -I 选项指示代码生成器搜索其他文件夹以查找您的 MATLAB 函数或自定义代码文件。

选项值描述
-I path

path 添加到代码生成路径的开头。当代码生成器搜索 MATLAB 函数或自定义 C/C++ 文件时,它首先搜索代码生成路径。由于它不在代码生成路径中搜索类,因此类必须位于 MATLAB 搜索路径中。有关详细信息,请参阅路径和文件基础架构设置

如果路径包含非 7 位 ASCII 字符(例如日语字符),则代码生成器可能在此路径中找不到文件。

要包含多条路径,请在每个要包含的路径前使用 -I。将路径作为字符向量或字符串传递。例如:

codegen -I "C:\Project" -I "C:\Custom Files" foo

导出生成代码

下表显示可用于将生成代码或代码生成设置传输到另一个开发环境或 MATLAB Coder 的选项。

选项值描述
-package zipFile

将生成的独立代码及其依赖关系打包到名为 zipFile 的压缩 ZIP 文件中。您可以使用该 ZIP 文件以转移到另一个开发环境中进行解包并重新编译代码文件。

使用此选项等效于使用 packNGo 函数。

-toproject projectFile

将入口函数名称、-args-nargout 设定、codegen 选项以及任何高级语法保存到名为 projectFileMATLAB Coder 工程文件中。如果您要将 codegen 设定传输到 MATLAB Coder,请使用此命令。您也可以使用此工程文件通过以下命令生成代码:

codegen projectFile

请参阅Convert codegen Command to Equivalent MATLAB Coder Project

执行数值转换

下表显示可用于执行 MATLAB 代码的数值转换的选项。您必须有 Fixed-Point Designer™ 许可证才能使用这些选项。不支持将这些选项用作命名空间中的入口函数。

选项值描述
-config:single

生成单精度 MATLAB 代码。

-double2single singleConfig

使用您在 singleConfig(它必须为 coder.SingleConfig 对象)中指定的设置生成单精度 MATLAB 代码。

代码生成器在文件夹 codegen/fun/single 中生成文件,其中 fun 是入口函数的名称。

如果指定此选项并指示代码生成器生成独立代码,则代码生成器还会在文件夹 codgen/outputType/subfolder 中生成单精度 C/C++ 代码,其中:

  • outputType 是:

    • mex(对于 MEX 函数)

    • lib(对于 C/C++ 库)

    • dll(对于 C/C++ 动态库)

    • exe(对于 C/C++ 可执行文件)

  • subfolder 是 MATLAB 函数的名称后跟后缀。使用 singleConfig 对象的 OutputFileNameSuffix 属性指定此后缀。

有关详细信息,请参阅Generate Single-Precision MATLAB Code

-float2fixed float2fixedConfig

使用您在 float2fixedConfig(它必须为 coder.FixPtConfig 对象)中指定的设置生成定点代码。

如果指定此选项并指示代码生成器生成独立代码,则代码生成器会生成定点 C/C++ 代码。代码生成器在文件夹 codegen/outputType/fun_fixpt 中生成文件,其中 fun 是入口函数的名称,outputType 是:

  • mex(对于 MEX 函数)

  • exe(对于可嵌入的 C/C++ 可执行文件)

  • lib(对于可嵌入的 C/C++ 库)

  • dll(对于 C/C++ 动态库)

如果指定此选项,但不生成独立代码,则代码生成器会在文件夹 codegen/fun/fixpt 中生成定点 MATLAB 代码。

要使用此选项,您必须使用 float2fixedConfig 对象的 TestBenchName 属性指定测试文件。

有关详细信息,请参阅Convert MATLAB Code to Fixed-Point C Code

-singleC

生成单精度 C/C++ 代码。有关详细信息,请参阅Generate Single-Precision C Code at the Command Line

生成 CUDA 代码

下表显示当您从 MATLAB 代码生成 CUDA® 代码时可以使用的选项。您必须有 GPU Coder™ 许可证才能使用这些选项。

选项值描述
-config gpuconfig

指定包含 CUDA 代码生成设置的配置对象。要生成此配置对象,请使用函数 coder.gpuConfig (GPU Coder)

请参阅Generate Code Using the Command Line Interface (GPU Coder)

-gpuprofile

使用 GPU 性能分析器对生成代码执行探查。

要使用单个命令生成和探查 CUDA 代码,请运行带 -gpuprofile-test 选项的 codegen

要对非 MEX 目标进行探查,您必须有 Embedded Coder 许可证。

有关详细信息,请参阅 GPU 性能分析器 (GPU Coder)

要为其生成代码的 MATLAB 函数,指定为函数名称。该函数必须存在于当前工作文件夹中或位于路径中。要指定 MATLAB 命名空间中的函数,请将命名空间名称添加到函数名称的开头,后跟一个句点。该命名空间也必须存在于当前工作文件夹中或位于路径中。如果 MATLAB 文件所在的路径包含非 7 位 ASCII 字符(例如日语字符),则代码生成器可能找不到该文件。

示例: codegen myFunction

示例: codegen myNamespace.myFunction

MATLAB 函数 fun 的输入参量,指定为由示例值或 coder.Type 对象组成的元胞数组。元胞数组中每个元素的位置必须对应于函数定义中输入参量的位置。

要创建 coder.Type 对象,请使用 coder.typeofcoder.newtype。要指示函数不接受参量,请将 inputs 指定为空元胞数组 {}

如果您在函数体中使用 arguments 块或 assert 语句定义输入参量,则无需指定 inputs 参量。有关详细信息,请参阅Use Function Argument Validation to Specify Entry-Point Input TypesSpecify Input Types Using assert Statements in MATLAB Code

示例: codegen foo -args {0}

示例: codegen foo2 -args {0, ones(3,5)}

示例: codegen foo3 -args {0, ones(3,5), coder.typeof("hello")}

要为 MATLAB 函数 fun 生成的输出参量的数目,指定为整数。代码生成器按照输出参量在 MATLAB 函数定义中出现的顺序生成指定数量的输出参量。如果函数 fun 使用 varargout,则必须指定输出参量数目。请参阅Specify Number of Input or Output Arguments to Entry-Point Functions

示例: codegen foo -nargout 2

示例: codegen foo -args {0} -nargout 2

高级代码生成语法,指定为语法片段或以空格分隔的语法片段列表。下表显示您可以按任意顺序组合的语法片段。

语法片段描述
fun1 -args inputs1 ... funN inputsN为多个入口函数生成代码。
fun -args inputs1 ... -args inputsN为一个入口函数生成多个签名。
file1 ... fileN

在生成代码中包含自定义源文件。您可以指定这些类型的文件:

  • C 文件 (.c)

  • C++ 文件 (.cpp)

  • 头文件 (.h)

  • 目标文件(.o.obj

  • 库(.a.so.dylib.lib

如果自定义文件所在的路径包含非 7 位 ASCII 字符(例如日语字符),则代码生成器命令可能找不到这些文件。

projectFile

MATLAB Coder 工程生成代码,指定为 CODERPRJ 文件。代码生成器使用在工程文件中保存的入口函数、输入类型和代码生成选项生成代码。请参阅Convert codegen Command to Equivalent MATLAB Coder Project

此语法不能与任何其他语法组合使用。

限制

  • 您不能为 MATLAB 脚本生成代码。请将脚本重写为函数来生成代码。

  • 不支持在当前文件夹是私有文件夹或 @ 文件夹时生成代码,因为这些文件夹在 MATLAB 中有特殊含义。您可以生成代码来调用 @ 文件夹中的方法和私有文件夹中的函数。

提示

  • 每次 codegen 为相同的代码或工程生成相同类型的输出时,都会删除上一次编译生成的文件。如果要保留以前的某次编译生成的文件,请在开始另一次编译之前将这些文件复制到其他位置。

  • 如果您未使用 -d 选项指定位置,则代码生成器将在文件夹 codgen/outputType/functionName 中创建 C/C++ 源文件、头文件和目标文件,其中 functionName 是您传递给 codegen 命令的第一个函数的名称,outputType 是以下项之一:

    • mex(对于 MEX 函数)

    • lib(对于 C/C++ 静态库)

    • dll(对于 C/C++ 动态库)

    • exe(对于 C/C++ 可执行文件)

    代码生成器将生成的 MEX 函数保存在工作文件夹中。

    例如,假设有以下 codegen 命令:

    codegen -config:lib fun1 fun2

    代码生成器会在文件夹 codgen/lib/fun1 中创建 C 源文件、头文件和目标文件。

  • 如果生成独立代码并且未使用 -o 选项指定输出文件名,则代码生成器会创建以您为其生成代码的 MATLAB 函数名称开头的源文件、头文件和目标文件。

  • 当您生成 MEX 函数并且未使用 -o 选项指定输出文件名时,代码生成器会将 _mex 追加到第一个 MATLAB 函数(按从左到右的顺序)的名称后。例如,由以下 codegen 命令生成的 MEX 函数的名称以 foo_mex 开头:

    codegen foo bar

  • 代码生成器将特定于平台的和特定于编译的扩展名追加到生成的文件:

    • .a.lib(适用于 C/C++ 静态库)

    • .exe 或无扩展名(适用于 C/C++ 可执行文件)

    • .dll(适用于 Microsoft® Windows® 平台上的 C/C++ 动态库)

    • .so(适用于 Linux® 平台上的 C/C++ 动态库)

    • .dylib(适用于 Mac 平台的 C/C++ 动态库)

    • 生成的 MEX 函数的与平台相关的扩展名

  • 您可以使用函数语法调用 codegen。将 codegen 参量指定为字符向量或字符串标量。例如:

    codegen('myfunction','-args',{2 3},'-report')
    
  • 要以编程方式调用 codegen,请使用函数语法。例如:

    A = {'myfunction','-args',{2 3}};
    codegen(A{:})
    

版本历史记录

在 R2011a 中推出

全部展开