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
相关产品推荐
相关产品推荐

