主要内容

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

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

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

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

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

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

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

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

  • DLL建造类型。

  • c++目标语言。

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

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

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

cfg = coder.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 = coder.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)及其正确路径:

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

  • 在视窗平台上,导入库(. 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 = coder.config (墨西哥人的);cfg。TargetLang =“c++”;codegen (“planetSim”“配置”cfg,“- d”“planetSim”“报告”、linkObjectMoon linkObjectEarth)
代码生成成功:要查看报告,打开('planetSim/html/report.mldatx')

测试生成的MEX函数

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

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

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

另请参阅

|||||

相关的话题