集成多个生成的C ++代码项目
此示例显示了如何将两个不同生成的C ++代码项目集成到一个较大的项目中。
您生成的代码项目可能具有相似的功能名称,但具有不同的设置,参数或功能。使用名称空间生成代码,以帮助集成共享相同名称的不同项目。名称空间还可以提高代码可读性。
生成MATLAB算法的C ++代码
考虑一个简单的MATLAB函数,该功能返回引力常数。重力常数的值源自全局变量。
功能c = getGravityConst%#codegen全球的g c = g;
假设您要生成代码getGravityConcst
这为月球和地球的场景建模。生成具有相同入口函数的两个单独的代码项目。为每个项目指定不同的全球值,因此,重力常数。
创建代码生成配置对象。指定:
DLL构建类型。
C ++目标语言。
轨道体的名称为命名空间。
#pragma一次
风格#包括
警卫。将生成的代码文件包装到一个
。压缩
通过调用Packngo
功能。
cfg = coder.config('dll');cfg.targetlang =“ C ++”;cfg.cppnamespace ='月亮';cfg.headerguardstyle =“使用pragmaonce”;CFG.PostCodeGencommand ='Packngo(buildInfo)';
生成代码getGravityConcst
建模月亮:
通过使用先前定义的配置对象。
带有代码生成报告。
因此,代码以m/s^2的单位返回月球的重力常数值。
在一个称为的输出文件夹中
ProjectMoon
。带有输出二进制
GetGravityConstmoon
。
代码根getGravityConcst-configCFG-报告- 全球{'g',-1.62}...-dProjectMoon-oGetGravityConstmoon
代码生成成功:要查看报告,打开('ProjectMoon/html/report.mldatx')。
生成代码getGravityConcst
这对地球进行建模,首先修改:
名称名称
引力常数
输出文件名
输出文件夹名称
cfg = coder.config('dll');cfg.targetlang =“ C ++”;cfg.cppnamespace ='地球';cfg.headerguardstyle =“使用pragmaonce”;CFG.PostCodeGencommand ='Packngo(buildInfo)';代码根getGravityConcst-configCFG-报告- 全球{'g',-9.81}...-dProjectEarth-oGetGravityConstearth
代码生成成功:要查看报告,打开('ProjectEarth/html/report.mldatx')。
项目集成方案:行星建模
假设您想设计一个执行行星建模的较大项目,并计算诸如落下对象的飞行时间之类的数量。飞行时间取决于每个行星的重力常数和物体的初始高度。您要使用生成的代码函数getGravityConcst
在这个较大的项目中。
确定依赖平台的文件扩展名
生成的动态库在不同平台上具有不同的扩展。此代码确定了您平台的正确扩展。
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
文件)。包括其他生成源的目录,并包括文件。
这。压缩
文件Packngo
命令在代码生成期间创建包含生成的代码文件。将zip文件解开为构建目录或构建环境中的文件夹。您还必须使您的动态库可以通过将生成的动态库移至与可执行文件的同一文件夹来访问可执行文件。
编写一个集成两个项目的MATLAB函数
作为手动编写主文件的替代方法,您还可以通过使用该项目将两个项目集成到第三生成的代码项目中CODER.CEVAL
功能。这CODER.CEVAL
功能使您可以从生成的C/C ++代码调用外部C/C ++代码。
文件Planetsim.M
显示如何使用CODER.CEVAL
并关联的构建配置功能将生成的项目集成到较大的项目中。
功能[T_M,T_E] = Planetsim%#codegen%示例函数将生成的代码项目与名称空间集成d = 10;g = 0;%添加外部功能名称的#include语句coder.cinclude('../projectmoon/getgravityconst.h');coder.cinclude('../projectearth/getGravityConst.h');%调用外部功能并进行计算g =编码器。'月亮:: getgravityconst');t_m = timetodrop(d,g);g =编码器。'Earth :: getGravityConst');t_e = timetodrop(d,g);功能t = timetodrop(d,g)t = sqrt(2*d/(-g));
生成MEX代码行星
功能:
linkObjectMoon = [“ ProjectMoon/GetGravityConstmoon”libext];linkObjectearth = ['ProjectEarth/getgravityConstearth'libext];cfg = coder.config('Mex');cfg.targetlang =“ C ++”;Codegen(Codegen)(“ Planetsim”,,,,'-config',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
输出显示了月球和地球上落下物体的飞行时间。
也可以看看
代码根
|Coder.CodeConfig
|CODER.CEVAL
|编码器
|coder.config
|Packngo