Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

MATLAB 代码生成独立的 C/C++ 可执行文件

使用 MATLAB Coder App 生成 C 可执行文件

此示例说明如何使用 MATLAB® Coder™ App 从 MATLAB 代码生成 C 可执行文件。在此示例中,您为 MATLAB 函数生成一个可执行文件,该函数用于生成随机标量值。使用该 App 可以执行以下操作:

  1. 生成示例 C main 函数,该函数调用生成的库函数。

  2. 复制并修改生成的 main.cmain.h

  3. 修改工程设置,以便 App 可以找到修改后的 main.cmain.h

  4. 生成可执行文件。

创建入口函数

在本地可写文件夹中,创建 MATLAB 函数 coderand,该函数在开区间 (0,1) 上基于标准均匀分布生成一个随机标量值:

function r = coderand() %#codegen
r = rand();

创建测试文件

在同一本地可写文件夹中,创建 MATLAB 文件 coderand_test.m,它调用 coderand

function y = coderand_test()
y = coderand();

打开 MATLAB Coder App

在 MATLAB 工具条的 App 选项卡上,点击 Code Generation 下的 MATLAB Coder App 图标。

该 App 会打开 Select Source Files 页面。

指定源文件

  1. Select Source Files 页面中,键入或选择入口函数 coderand 的名称。

    该 App 将使用默认名称 coderand.prj 在当前文件夹中创建一个工程。

  2. 点击 Next 以转到 Define Input Types 步骤。该 App 将分析函数以查找编码问题并确定代码生成就绪情况。如果 App 发现问题,它将打开 Review Code Generation Readiness 页面,您可以在其中查看和解决问题。在此示例中,由于 App 没有检测到问题,因此将打开 Define Input Types 页面。

定义输入类型

由于 C 使用静态类型,MATLAB Coder 必须在编译时确定 MATLAB 文件中所有变量的属性。您必须指定所有入口函数输入的属性。根据入口函数输入的属性,MATLAB Coder 可以推断 MATLAB 文件中所有变量的属性。

在此示例中,函数 coderand 没有输入。

点击 Next 以转到 Check for Run-Time Issues 步骤。

检查运行时问题

Check for Run-Time Issues 步骤从您的入口函数生成 MEX 文件,然后运行 MEX 函数并报告问题。此步骤是可选的。不过,建议最好执行此步骤。您可以检测并解决在生成的 C 代码中更难诊断出来的运行时错误。

  1. 要打开 Check for Run-Time Issues 对话框,请点击 Check for Issues 箭头

    选择或输入测试文件 coderand_test

  2. 点击 Check for Issues

    App 将为 coderand 生成一个 MEX 函数。它运行测试文件,将对 coderand 的调用替换为对 MEX 函数的调用。如果 App 在 MEX 函数生成或执行过程中检测到问题,它将提供警告和错误消息。您可以点击这些消息,导航到有问题的代码并修复问题。在本示例中,App 未检测到问题。

  3. 点击 Next 以转到 Generate Code 步骤。

生成 C main 函数

在生成可执行文件时,您必须提供一个 C/C++ 主函数。默认情况下,当您生成 C/C++ 源代码、静态库、动态链接库或可执行文件时,MATLAB Coder 会生成 main 函数。这一生成的主函数是一个模板,您可以针对您的应用程序修改该模板。请参阅使用示例主函数合并生成的代码。在复制和修改生成的主函数后,可以使用它来生成 C/C++ 可执行文件。您也可以编写自己的主函数。

在为 coderand 生成可执行文件之前,请生成 main 函数,该函数调用 coderand

  1. 要打开 Generate 对话框,请点击 Generate 箭头

  2. Generate 对话框中,将 Build type 设置为 “Source Code”,将 Language 设置为 C。对于其他工程编译配置设置,请使用默认值。

  3. 点击 More settings

  4. All Settings 选项卡的 Advanced 下,确认 Generate example main 设置为 “Generate, but do not compile, an example main function”。点击 Close

  5. 点击 Generate

    MATLAB Coder 生成一个 main.c 文件和一个 main.h 文件。App 指示代码生成成功。

  6. 点击 Next 打开 Finish Workflow 页面。

    Finish Workflow 页面的 Generated Output 下,您会看到 main.c 位于子文件夹 coderand\codegen\lib\coderand\examples 中。

复制生成的示例主文件

由于后续代码生成可能覆盖生成的示例文件,因此在修改这些文件之前,请将它们复制到 codegen 文件夹之外的一个可写文件夹中。对于此示例,请将 main.cmain.h 从子文件夹 coderand\codegen\lib\coderand\examples 复制到一个可写文件夹中,例如 c:\myfiles

修改生成的示例主文件

  1. 在包含示例主文件副本的文件夹中,打开 main.c

     生成的 main.c

  2. 修改 main.c,使其打印 coderand 调用的结果:

    • main_coderand 中,删除以下行

      double r;

    • main_coderand 中,将

      r = coderand()
      替换为:
      printf("coderand=%g\n", coderand());

    • 对于此示例,main 没有参数。在 main 中,删除以下行:

      (void)argc;
      (void)argv;

      main 的定义更改为

      int main()

     修改后的 main.c

  3. 打开 main.h

     生成的 main.h

  4. 修改 main.h

    • stdio 添加到 include 文件中:

      #include <stdio.h>

    • 将 main 的声明更改为

      extern int main()

 修改后的 main.h

生成可执行文件

  1. 要打开 Generate Code 页面,请展开工作流步骤 ,然后点击 Generate

  2. 要打开 Generate 对话框,请点击 Generate 箭头

  3. Build type 设置为 “Executable (.exe)”。

  4. 点击 More settings

  5. Custom Code 选项卡的 Additional source files 中,输入 main.c

  6. Custom Code 选项卡的 Additional include directories 中,输入修改后的 main.cmain.h 文件的位置。例如,c:\myfiles。点击 Close

  7. 要生成可执行文件,请点击 Generate

    App 指示代码生成成功。

  8. 点击 Next 以转至 Finish Workflow 步骤。

  9. Generated Output 下,您可以看到生成的可执行文件 coderand.exe 的位置。

运行可执行文件

要在 Windows® 平台上的 MATLAB 中运行可执行文件,请执行以下命令:

system('coderand')

在命令行中生成 C 可执行文件

在此示例中,您将创建一个生成随机标量值的 MATLAB 函数和一个调用此 MATLAB 函数的 C 主函数。然后指定函数输入参数的类型,指定主函数,并为 MATLAB 代码生成 C 可执行文件。

  1. 编写一个 MATLAB 函数 coderand,该函数在开区间 (0,1) 上基于标准均匀分布生成一个随机标量值:

    function r = coderand() %#codegen
    r = rand();
  2. 编写一个 C 主函数 c:\myfiles\main.c,它调用 coderand。例如:

    /*
    ** main.c
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include "coderand.h"
    #include "coderand_terminate.h"
    
    int main()
    {
        /* The initialize function is called automatically from the generated entry-point function. 
           So, a call to initialize is not included here. */ 
        
        printf("coderand=%g\n", coderand());
        
        coderand_terminate();
        
        return 0;
    }

    注意

    在此示例中,由于默认文件分区方法是为每个 MATLAB 文件生成一个文件,因此您要包含 "coderand_terminate.h"。如果您的文件分区方法设置为对所有函数只生成一个文件,请不要包含 "coderand_terminate.h"

  3. 将代码生成参数配置为包含 C 主函数,然后生成 C 可执行文件:

    cfg = coder.config('exe');
    cfg.CustomSource = 'main.c';
    cfg.CustomInclude = 'c:\myfiles';
    codegen -config cfg coderand 

    codegen 在当前文件夹中生成 C 可执行文件 coderand.exe。它在默认文件夹 codegen/exe/coderand 中生成支持文件。codegen 为所选代码替换库所需的头文件生成最小的 #include 语句集。

指定 C/C++ 可执行文件的主函数

生成可执行文件时,您必须提供 main 函数。对于 C 可执行文件,请提供 C 文件 main.c。对于 C++ 可执行文件,请提供 C++ 文件 main.cpp。确认包含主函数的文件夹中只有一个主文件。否则,main.c 将优先于 main.cpp,这会在生成 C++ 代码时导致错误。您可以从工程设置对话框、命令行或 Code Generation 对话框中指定主文件。

默认情况下,当您生成 C/C++ 源代码、静态库、动态链接库或可执行文件时,MATLAB Coder 会生成 main 函数。这一生成的主函数是一个模板,您可以针对您的应用程序修改该模板。请参阅使用示例主函数合并生成的代码。在复制和修改生成的主函数后,可以使用它来生成 C/C++ 可执行文件。您也可以编写自己的主函数。

将 MATLAB 函数转换为 C/C++ 库函数或 C/C++ 可执行文件时,MATLAB Coder 会生成一个初始化函数和一个终止函数。

  • 如果您的文件分区方法设置为对每个 MATLAB 文件生成一个文件,则您必须在 main.c 中包含终止头函数。否则,不要将其包含在 main.c 中。

  • 有关调用初始化和终止函数的详细信息,请参阅Use Generated Initialize and Terminate Functions

指定主函数

使用 MATLAB Coder App 指定主函数

  1. 要打开 Generate 对话框,请在 Generate Code 页上点击 Generate 箭头

  2. 点击 More settings

  3. Custom Code 选项卡上,进行如下设置:

    1. Additional source files 设置为包含 main 函数的 C/C++ 源文件的名称。例如,main.c。有关详细信息,请参阅指定 C/C++ 可执行文件的主函数

    2. Additional include directories 设置为 main.c 的位置。例如,c:\myfiles

在命令行中指定主函数

设置代码生成配置对象的 CustomSourceCustomInclude 属性(请参阅使用配置对象)。CustomInclude 属性指示由 CustomSource 指定的 C/C++ 文件的位置。

  1. 为可执行文件创建配置对象:

    cfg = coder.config('exe');
    
  2. CustomSource 属性设置为包含 main 函数的 C/C++ 源文件的名称。(有关详细信息,请参阅指定 C/C++ 可执行文件的主函数。)例如:

    cfg.CustomSource = 'main.c';

  3. CustomInclude 属性设置为 main.c 的位置。例如:

    cfg.CustomInclude = 'c:\myfiles';

  4. 使用命令行选项生成 C/C++ 可执行文件。例如,如果 myFunction 接受 double 类型的一个输入参数:

    codegen -config cfg  myMFunction -args {0}

    MATLAB Coder 将对主函数进行编译并将它与从 myMFunction.m 生成的 C/C++ 代码进行链接。