从 MATLAB 代码生成独立的 C/C++ 可执行文件
使用 MATLAB Coder 生成 C 可执行文件
此示例说明如何使用 MATLAB® Coder™ App 从 MATLAB 代码生成 C 可执行文件。在此示例中,您为 MATLAB 函数生成一个可执行文件,该函数用于生成随机标量值。
首先,您创建一个 MATLAB 示例函数和测试文件。然后,您:
通过使用 MATLAB Coder 将 MATLAB 添加为入口函数。
生成一个示例 C
main函数,该函数调用生成的库函数。修改生成的
main.c和main.h。修改代码生成设置,以便 App 可以找到修改后的
main.c和main.h。生成可执行文件。
创建 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。
默认情况下,MATLAB Coder 生成 C 静态库。要验证这些设置,请在工具条的 MATLAB Coder 选项卡上,点击语言按钮以验证生成代码的语言是否为 C,并点击输出类型按钮以验证输出类型是否为静态库。
点击设置以打开“代码生成设置”对话框。在高级窗格中,验证生成示例主函数参数是否设置为生成但不编译示例主函数。
在工具条的 MATLAB Coder 选项卡上,点击生成代码。App 在文件夹
codegen/lib/coderand/examples中生成文件main.c和main.h。
修改生成的示例 main 文件
由于后续代码生成可能会覆盖生成的示例文件,请在修改生成的 main 文件之前将其复制到可写文件夹。对于此示例,请将 main.c 和 main.h 复制到工作目录。
打开
main.c。修改
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()); }对于此示例,
main函数没有参量。在main函数中,删除以下行:(void)argc; (void)argv;更改
main函数的定义。删除以下行:int main(int argc, char **argv)用以下行替换删除的行:
int main()保存您的更改。
打开
main.h。在
/* Include Files */注释下,添加以下行:#include <stdio.h>更改
main函数的声明。删除以下行:extern int main(int argc, char **argv);用以下行替换删除的行:
extern int main();保存您的更改。
修改代码生成设置
在修改生成的示例主文件后,您必须修改代码生成设置以指示代码生成器使用修改后的 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 可执行文件。
编写一个 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 中使用“代码生成设置”对话框来指定可执行文件的主函数。
使用命令行
设置代码生成配置对象的 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++ 代码进行链接。
使用 MATLAB Coder
设置输出类型、其他源文件和其他包括目录参数。其他包括目录参数指示由其他源文件参数指定的 C/C++ 文件的位置。
要设置输出类型,请在工具条的 MATLAB Coder 选项卡上,点击输出类型 > 可执行文件(.exe)。
要打开“代码生成设置”对话框,请在工具条的 MATLAB Coder 选项卡上,点击设置。
在“代码生成设置”对话框中,将其他源文件设置为包含
main函数的 C/C++ 源文件的名称。将其他包括目录参数设置为main.c的位置。要生成可执行文件,请在工具条的 MATLAB Coder 选项卡上,点击生成代码并编译。
另请参阅
codegen | coder.MexCodeConfig | coder.CodeConfig | coder.EmbeddedCodeConfig