从 MATLAB 代码生成独立的 C/C++ 可执行文件
使用 MATLAB Coder App 生成 C 可执行文件
此示例说明如何使用 MATLAB® Coder™ App 从 MATLAB 代码生成 C 可执行文件。在此示例中,您为 MATLAB 函数生成一个可执行文件,该函数用于生成随机标量值。使用该 App 可以执行以下操作:
生成一个示例 C
main
函数,该函数调用生成的库函数。复制并修改生成的
main.c
和main.h
。修改工程设置,以便 App 可以找到修改后的
main.c
和main.h
。生成可执行文件。
创建入口函数
在本地可写文件夹中,创建 MATLAB 函数 coderand
,该函数在开区间 (0,1) 上基于标准均匀分布生成一个随机标量值:
function r = coderand() %#codegen r = rand();
创建测试文件
在同一本地可写文件夹中,创建 MATLAB 文件 coderand_test.m
,它调用 coderand
。
function y = coderand_test()
y = coderand();
打开 MATLAB Coder
在 MATLAB 工具条的 App 选项卡上,点击代码生成下的 MATLAB Coder 图标。
该 App 会打开选择源文件页面。
指定源文件
在选择源文件页面中,键入或选择入口函数
coderand
的名称。该 App 将使用默认名称
coderand.prj
在当前文件夹中创建一个工程。点击下一步以转到定义输入类型步骤。该 App 将分析函数以查找编码问题并确定代码生成就绪情况。如果 App 发现问题,它将打开检查代码就绪性页面,您可以在其中查看和解决问题。在此示例中,由于 App 没有检测到问题,因此将打开定义输入类型页面。
定义输入类型
由于 C 使用静态定型,MATLAB Coder 必须在编译时确定 MATLAB 文件中所有变量的属性。您必须指定所有入口函数输入的属性。根据入口函数输入的属性,MATLAB Coder 可以推断 MATLAB 文件中所有变量的属性。
在此示例中,函数 coderand
没有输入。
点击下一步以转到检查运行时问题步骤。
检查运行时问题
检查运行时问题步骤从您的入口函数生成 MEX 文件,然后运行 MEX 函数并报告问题。此步骤是可选的。不过,建议最好执行此步骤。您可以检测并解决在生成的 C 代码中更难诊断出来的运行时错误。
要打开检查运行时问题对话框,请点击检查问题箭头 。
选择或输入测试文件
coderand_test
。点击检查问题。
App 将为
coderand
生成一个 MEX 函数。它运行测试文件,将对coderand
的调用替换为对 MEX 函数的调用。如果 App 在 MEX 函数生成或执行过程中检测到问题,它将提供警告和错误消息。您可以点击这些消息,导航到有问题的代码并修复问题。在本示例中,App 未检测到问题。点击下一步以转到生成代码步骤。
生成 C main
函数
在生成可执行文件时,您必须提供一个 C/C++ 主函数。默认情况下,当您生成 C/C++ 源代码、静态库、动态链接库或可执行文件时,MATLAB Coder 会生成 main
函数。这一生成的主函数是一个模板,您可以针对您的应用程序修改该模板。请参阅使用示例主函数合并生成的代码。在复制和修改生成的主函数后,可以使用它来生成 C/C++ 可执行文件。您也可以编写自己的主函数。
在为 coderand
生成可执行文件之前,请生成 main
函数,该函数调用 coderand
。
要打开生成对话框,请点击生成 箭头 。
在生成对话框中,将编译类型设置为源代码,将语言设置为 C。对于其他工程编译配置设置,请使用默认值。
点击更多设置。
在所有设置选项卡的高级下,确认生成示例主函数设置为生成但不编译示例主函数。点击关闭。
点击生成。
MATLAB Coder 生成一个
main.c
文件和一个main.h
文件。App 指示代码生成成功。点击下一步打开完成工作流页面。
在完成工作流页面的生成的输出下,您会看到
main.c
位于子文件夹coderand\codegen\lib\coderand\examples
中。
复制生成的示例主文件
由于后续代码生成可能覆盖生成的示例文件,因此在修改这些文件之前,请将它们复制到 codegen
文件夹之外的一个可写文件夹中。对于此示例,请将 main.c
和 main.h
从子文件夹 coderand\codegen\lib\coderand\examples
复制到一个可写文件夹中,例如 c:\myfiles
。
修改生成的示例主文件
在包含示例主文件副本的文件夹中,打开
main.c
。修改
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.h
。修改
main.h
:将
stdio
添加到包含文件中:#include <stdio.h>
将 main 的声明更改为
extern int main()
生成可执行文件
在修改生成的示例主文件后,打开之前创建的工程文件或从 App 中选择 coderand.m
。您可以选择覆盖该工程,或以不同名称命名工程以同时保存这两个工程文件。
要打开生成代码页面,请展开工作流步骤 ,然后点击生成
要打开生成对话框,请点击生成 箭头 。
将编译类型设置为可执行文件(.exe)。
点击更多设置。
在自定义代码选项卡的其他源文件中,输入
main.c
在自定义代码选项卡的其他包括目录中,输入修改后的
main.c
和main.h
文件的位置。例如,c:\myfiles
。点击关闭。要生成可执行文件,请点击生成。
App 指示代码生成成功。
点击下一步以转至完成工作流步骤。
在生成的输出下,您可以看到生成的可执行文件
coderand.exe
的位置。
运行可执行文件
要在 Windows® 平台上的 MATLAB 中运行可执行文件,请执行以下命令:
system('coderand')
注意
此示例中可执行的 coderand
函数返回介于 0 到 1 之间的固定值。要生成每次执行都会产生新值的代码,请在 MATLAB 代码中使用 RandStream
函数。
在命令行中生成 C 可执行文件
在此示例中,您将创建一个生成随机标量值的 MATLAB 函数和一个调用此 MATLAB 函数的 C 主函数。然后指定函数输入参数的类型,指定主函数,并为 MATLAB 代码生成 C 可执行文件。
编写一个 MATLAB 函数
coderand
,该函数在开区间 (0,1) 上基于标准均匀分布生成一个随机标量值:function r = coderand() %#codegen r = rand();
编写一个 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"
。将代码生成参数配置为包含 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 指定主函数
要打开生成对话框,请在生成代码页上点击生成箭头 。
点击更多设置。
在自定义代码选项卡上,进行如下设置:
将其他源文件设置为包含
main
函数的 C/C++ 源文件的名称。例如,main.c
。有关详细信息,请参阅指定 C/C++ 可执行文件的主函数。将其他包括目录设置为
main.c
的位置。例如,c:\myfiles
。
在命令行中指定主函数
设置代码生成配置对象的 CustomSource
和 CustomInclude
属性(请参阅配置编译设置)。CustomInclude
属性指示由 CustomSource
指定的 C/C++ 文件的位置。
为可执行文件创建配置对象:
cfg = coder.config('exe');
将
CustomSource
属性设置为包含main
函数的 C/C++ 源文件的名称。(有关详细信息,请参阅指定 C/C++ 可执行文件的主函数。)例如:cfg.CustomSource = 'main.c';
将
CustomInclude
属性设置为main.c
的位置。例如:cfg.CustomInclude = 'c:\myfiles';
使用命令行选项生成 C/C++ 可执行文件。例如,如果
myFunction
接受double
类型的一个输入参数:codegen -config cfg myMFunction -args {0}
MATLAB Coder 将对主函数进行编译并将它与从
myMFunction.m
生成的 C/C++ 代码进行链接。