主要内容

集成多个生成的c++代码项目

这个例子展示了如何将两个不同的生成的c++代码项目集成到一个更大的项目中。

您生成的代码项目可能具有类似的函数名称,但具有不同的设置、参数或功能。生成带有名称空间的代码,以帮助集成具有相同名称的不同项目。名称空间还可以提高代码的可读性。

生成MATLAB®算法的c++代码

考虑一个简单的MATLAB函数,它返回一个引力常数。引力常数的值是由一个全局变量推导出来的。

类型getGravityConst.m
函数c = getGravityConst %#codegen全局g c = g;

假设您想为getGravityConst模拟月球和地球的情景。使用相同的入口点函数生成两个独立的代码项目。为每个项目指定不同的全局值,也就是引力常数。

创建一个代码生成配置对象。指定:

  • DLL构建类型。

  • c++目标语言。

  • 轨道体的名称作为命名空间。

  • # pragma一旦风格# include警卫。

  • 将生成的代码文件打包到. zip通过调用packNGo函数。

CFG = code .config(“dll”);cfg。TargetLang =“c++”;cfg。CppNamespace =“月亮”;cfg。HeaderGuardStyle =“UsePragmaOnce”;cfg。PostCodeGenCommand =“packNGo (buildInfo)”

getGravityConst来模拟月球

  • 通过使用前面定义的配置对象。

  • 用代码生成报告。

  • 这样,代码返回月球引力常数的值,单位为m/s^2。

  • 在一个名为projectMoon

  • 调用输出二进制文件getGravityConstMoon

codegengetGravityConst配置cfg报告全局变量{‘g’,-1.62}...- dprojectMoon- ogetGravityConstMoon
要查看报告,打开('projectMoon/html/report.mldatx')

为以下内容生成代码getGravityConst建立地球模型,首先修改:

  • 名称空间的名字

  • 引力常数

  • 输出文件名

  • 输出文件夹名称

CFG = code .config(“dll”);cfg。TargetLang =“c++”;cfg。CppNamespace =“地球”;cfg。HeaderGuardStyle =“UsePragmaOnce”;cfg。PostCodeGenCommand =“packNGo (buildInfo)”;codegengetGravityConst配置cfg报告全局变量{‘g’,-9.81}...- dprojectEarth- ogetGravityConstEarth
要查看报告,打开('projectEarth/html/report.mldatx')

项目集成场景:行星建模

假设您想要设计一个更大的项目,执行行星建模并计算诸如下落物体的飞行时间等数量。飞行时间取决于每个行星的引力常数和物体的初始高度。您希望将生成的代码函数用于getGravityConst在这个大项目中。

确定平台相关的文件扩展名

生成的动态库在不同的平台上有不同的扩展。这段代码决定了平台的正确扩展。

dllext =;libext =如果Ismac dllext =' . dylib ';Libext = dllext;elseifIsunix dllext =“所以”;Libext = dllext;elseifIspc dllext =. dll”;libext =“lib”其他的disp (“不支持平台”金宝app返回结束

编写一个使用生成的代码项目的主文件

在一般情况下,您可以通过编写或修改主文件来调用每个项目的函数来集成不同的项目。通过使用名称空间,您可以为每个项目区分生成的函数,即使函数名称相同。

有关如何为两个项目编写使用生成的c++代码的主文件的示例,请参阅所附文件main_planetSim.cpp.要从主文件构建可执行文件或二进制文件,您必须指定或提供以下构建工具(编译器、链接器和/或IDE)及其正确路径:

  • 任何被调用函数的头文件。

  • 在Windows平台上,导入库(. lib文件)。

  • 动态库(. dll所以而且. dylib文件)。

  • 包括其他生成的源文件的目录和文件。

. zip的文件packNGo在代码生成过程中创建的命令包含生成的代码文件。将zip文件解压缩到构建目录或构建环境中的文件夹中。您还必须使您的动态库可被可执行文件访问,例如,通过将生成的动态库移动到与可执行文件相同的文件夹中。

编写一个集成两个项目的MATLAB函数

方法将两个项目集成到第三个生成的代码项目中,作为手工编写主文件的替代方法coder.ceval函数。的coder.ceval函数允许您从生成的C/ c++代码调用外部C/ c++代码。

该文件planetSim.m演示如何使用coder.ceval以及相关的构建配置功能,以将生成的项目集成到更大的项目中。

<包括> planetSim.m < /包括>

生成的MEX代码planetSim功能:

linkObjectMoon = [“projectMoon / getGravityConstMoon”libext];linkObjectEarth = [“projectEarth / getGravityConstEarth”libext];CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”;codegen (“planetSim”“配置”cfg,“- d”“planetSim”“报告”、linkObjectMoon linkObjectEarth)
要查看报告,打开('planetSim/html/report.mldatx')

测试生成的MEX函数

在MATLAB环境中使用MEX函数对生成的代码进行测试。MEX函数必须能够访问生成的链接库。将链接库移动到当前目录并调用MEX函数。

拷贝文件([“projectMoon / getGravityConstMoon”dllext]);拷贝文件([“projectEarth / getGravityConstEarth”dllext]);[t_m, t_e] = planetSim_mex . [t_m, t_e] = planetSim_mex .
T_m = 3.5136
T_e = 1.4278

输出显示了物体在月球和地球上的飞行时间。

另请参阅

|||||

相关的话题