You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab 2021a用legacy_code编译S-function时-D宏不生效如何解决

问题原因

你调用legacy_code('generate_for_sim', specs)时,该命令会自动触发源代码编译流程,此时你没有传入宏定义参数,所以在这个阶段编译MexTest.c就已经触发了未定义宏的报错,后续单独调用compile传入的宏参数根本没有执行机会。从你贴出的编译日志也能看到,触发报错的编译命令确实没有携带两个-D开头的宏定义参数。

解决方法

有三种可行的配置方式,任选其一即可:

方案1:给generate_for_sim直接传编译参数

generate_for_sim本身支持传入编译选项,不需要单独调用compile:

specs               = legacy_code('initialize');
specs.HeaderFiles   = {'MexTest.h'};
specs.SourceFiles   = {'MexTest.c'};
specs.SFunctionName = 'Test_SFunc_gen';
specs.OutputFcnSpec = 'void TestFnc(double u1[1], double y1[1])';
legacy_code('sfcn_cmex_generate', specs);
% 直接把宏定义参数传入generate_for_sim,内部编译时会自动携带
legacy_code('generate_for_sim',specs, {'-DTEST_DEF1', '-DTEST_DEF2'});

方案2:关闭自动编译,单独调用compile传参数

如果你需要分步执行生成和编译流程,可以关闭generate_for_sim的自动编译逻辑:

specs               = legacy_code('initialize');
specs.HeaderFiles   = {'MexTest.h'};
specs.SourceFiles   = {'MexTest.c'};
specs.SFunctionName = 'Test_SFunc_gen';
specs.OutputFcnSpec = 'void TestFnc(double u1[1], double y1[1])';
legacy_code('sfcn_cmex_generate', specs);
% 第三个参数设为false,关闭自动编译
legacy_code('generate_for_sim',specs, false);
% 单独调用compile时传入宏定义
legacy_code('compile', specs, {'-DTEST_DEF1', '-DTEST_DEF2'});

方案3:把编译参数写入specs配置属性

直接把宏定义加到specs的编译属性中,所有编译步骤都会自动生效,不需要每次调用命令时传参:

specs               = legacy_code('initialize');
specs.HeaderFiles   = {'MexTest.h'};
specs.SourceFiles   = {'MexTest.c'};
specs.SFunctionName = 'Test_SFunc_gen';
specs.OutputFcnSpec = 'void TestFnc(double u1[1], double y1[1])';
% 直接配置全局编译参数
specs.CompileFlags = {'-DTEST_DEF1', '-DTEST_DEF2'};
legacy_code('sfcn_cmex_generate', specs);
legacy_code('generate_for_sim',specs);

内容的提问来源于stack exchange,提问作者Tequila Drinks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:57:02