主要内容

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

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

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

首先,您创建一个 MATLAB 示例函数和测试文件。然后,您:

  1. 通过使用 MATLAB Coder 将 MATLAB 添加为入口函数。

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

  3. 修改生成的 main.cmain.h

  4. 修改代码生成设置,以便 App 可以找到修改后的 main.cmain.h

  5. 生成可执行文件。

创建 MATLAB 示例函数和测试文件

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

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

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

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

添加入口函数

从 MATLAB 工具条上的 App 选项卡打开 MATLAB Coder

在“创建 MATLAB Coder 工程”对话框中,为您的工程指定名称。对于此示例,输入 coderand.coderprj。App 在工作文件夹中创建工程文件。

通过点击工具条的 MATLAB Coder 选项卡上的入口函数按钮打开入口函数窗格。输入 coderand 作为入口函数的名称。由于 coderand 函数没有输入参量,您不需要指定输入类型。

在生成独立代码之前,最佳做法是从您的 MATLAB 代码生成一个 MEX 函数,并使用测试文件运行生成的 MEX 函数。此步骤可以帮助识别代码生成期间和运行时的错误,这些错误在独立代码中可能更难诊断。要执行此步骤,请在工具条的 MATLAB Coder 选项卡中,点击运行生成的 MEX > 运行文件。选择测试文件 coderand_test.m。App 成功生成并运行 MEX 文件。

生成 C main 函数

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

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

  1. 默认情况下,MATLAB Coder 生成 C 静态库。要验证这些设置,请在工具条的 MATLAB Coder 选项卡上,点击语言按钮以验证生成代码的语言是否为 C,并点击输出类型按钮以验证输出类型是否为静态库。

  2. 点击设置以打开“代码生成设置”对话框。在高级窗格中,验证生成示例主函数参数是否设置为生成但不编译示例主函数

  3. 在工具条的 MATLAB Coder 选项卡上,点击生成代码。App 在文件夹 codegen/lib/coderand/examples 中生成文件 main.cmain.h

修改生成的示例 main 文件

由于后续代码生成可能会覆盖生成的示例文件,请在修改生成的 main 文件之前将其复制到可写文件夹。对于此示例,请将 main.cmain.h 复制到工作目录。

  1. 打开 main.c

  2. 修改 main_coderand 函数,使其输出 coderand 调用的结果。删除以下 C 代码:

    void main_coderand(void)
    {
      double r;
      /* Call the entry-point 'coderand'. */
      r = coderand();
    }

    用以下代码替换删除的 C 代码:

    void main_coderand(void)
    {
      /* Call the entry-point 'coderand' and print the results. */
      printf("coderand=%g\n", coderand());
    }

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

      (void)argc;
      (void)argv;

    更改 main 函数的定义。删除以下行:

    int main(int argc, char **argv)

    用以下行替换删除的行:

    int main()

  4. 保存您的更改。

  5. 打开 main.h

  6. /* Include Files */ 注释下,添加以下行:

    #include <stdio.h>

  7. 更改 main 函数的声明。删除以下行:

    extern int main(int argc, char **argv);

    用以下行替换删除的行:

    extern int main();

  8. 保存您的更改。

修改代码生成设置

在修改生成的示例主文件后,您必须修改代码生成设置以指示代码生成器使用修改后的 C 文件创建一个可执行的 C 函数。

  • 要将输出类型更改为可执行文件,请在工具条的 MATLAB Coder 选项卡上,点击输出类型 > 可执行文件(.exe)

  • 要指示代码生成器使用修改后的 C 主函数,请通过点击工具条的 MATLAB Coder 选项卡上的设置打开“代码生成设置”对话框。在自定义代码窗格上的其他源文件框中输入 main.c

生成可执行文件

要生成可执行文件,请在工具条的 MATLAB Coder 选项卡上点击生成代码并编译。App 在工作文件夹中生成文件 coderand.exe

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

system('coderand')

此示例中可执行的 coderand 函数返回介于 0 到 1 之间的固定值。要生成每次执行都会产生新值的代码,请在 MATLAB 代码中使用 RandStream 函数。

在命令行中生成 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 中使用“代码生成设置”对话框来指定可执行文件的主函数。

使用命令行

设置代码生成配置对象的 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++ 代码进行链接。

使用 MATLAB Coder

设置输出类型其他源文件其他包括目录参数。其他包括目录参数指示由其他源文件参数指定的 C/C++ 文件的位置。

  1. 要设置输出类型,请在工具条的 MATLAB Coder 选项卡上,点击输出类型 > 可执行文件(.exe)

  2. 要打开“代码生成设置”对话框,请在工具条的 MATLAB Coder 选项卡上,点击设置

  3. 在“代码生成设置”对话框中,将其他源文件设置为包含 main 函数的 C/C++ 源文件的名称。将其他包括目录参数设置为 main.c 的位置。

  4. 要生成可执行文件,请在工具条的 MATLAB Coder 选项卡上,点击生成代码并编译

另请参阅

| | |

主题