Simulink的MATLAB Function块调用clibgen生成的C++接口报错如何解决?
错误根因
Simulink MATLAB Function 块的运行依赖 Simulink Coder 做类型推导,即便你给 CLib 接口加了 coder.extrinsic 声明,Coder 也无法识别 clibgen 生成的自定义 C++ 类对象的结构,会将这类对象识别为泛型 mxArray,无法直接访问其成员字段,就会触发 "Attempt to extract field 'i' from 'mxArray'" 报错。
解决步骤
- 封装CLib交互逻辑到外部普通MATLAB函数
不要在MATLAB Function块内直接操作CLib对象的成员,将所有CLib对象实例化、成员赋值、业务计算逻辑全部抽离到独立的普通.m函数中,这个函数的输入输出只能用MATLAB内置类型(数值、数组、逻辑等),不能返回CLib自定义类对象。
示例封装函数calculate_cube_internal.m:
function cube = calculate_cube_internal(size_x, size_y, range_x_min, range_x_max, ... range_y_min, range_y_max, power, transmitter_height, receiver_height, ... transmitter_position, frequency) % 所有CLib操作全部放在该普通MATLAB函数内执行 index = clib.Wave.Wave.Index; radio_wave = clib.Wave.Wave.EMWave; terrain = clib.Wave.Wave.Terrain(200,200,range_x_min,range_y_min,range_x_max,range_y_max); index.i = 1; index.j = 1; % 此处补充你的业务计算逻辑 cube = zeros(200,200); % 替换为实际计算得到的cube数组 end
- 修改MATLAB Function块代码
只需要在块内声明封装好的外部函数为extrinsic,提前预定义输出变量的类型和维度即可:
function cube = fcn(size_x, size_y, range_x_min, range_x_max, ... range_y_min, range_y_max, power, ... transmitter_height, receiver_height, ... transmitter_position, frequency) coder.extrinsic('calculate_cube_internal'); % 预定义输出,类型、维度和外部函数返回值完全一致 cube = zeros(200,200); % 调用外部封装函数得到结果 cube = calculate_cube_internal(size_x, size_y, range_x_min, range_x_max, ... range_y_min, range_y_max, power, transmitter_height, receiver_height, ... transmitter_position, frequency); end
- 补充Simulink配置项
打开模型的「配置参数」面板,做如下修改:
- 进入「仿真目标」选项卡,将「语言」设置为
C++,匹配你调用的C++库编译类型 - 在「仿真目标」>「自定义代码」栏,依次填入你的C++库的头文件搜索路径、库文件搜索路径、需要链接的静态库文件名(Windows为
.lib,Linux为.so) - 如果需要用加速仿真模式,勾选「动态链接库接口支持」相关选项(不同MATLAB版本命名略有差异)
内容的提问来源于stack exchange,提问作者Sontung Dang
相关产品推荐
相关产品推荐

