Meson子项目无法识别avx_opt选项,构建配置哪里存在问题?
问题原因
Meson的构建选项默认是项目隔离的,主项目meson_options.txt中定义的选项仅作用于主项目上下文,子项目无法直接读取,核心错误点有两个:
- 你在子项目
mysub的meson.build中直接调用get_option('avx_opt'),但avx_opt是主项目定义的选项,子项目自身没有声明这个选项,所以触发未知选项报错 - 你使用
-Davx_opt:mysub=avx512传参也报错,是因为子项目自身没有定义avx_opt选项,指定子项目的不存在选项同样会校验失败
修复方案
方案1:子项目独立声明选项(推荐,兼容单独编译子项目的场景)
- 在
src/mysub目录下新建meson_options.txt,写入和主项目一致的选项定义:
option('avx_opt', type : 'combo', choices : ['avx2', 'avx512'], value : 'avx512')
- 如果需要主项目的选项自动同步给子项目,修改主项目
meson.build中的依赖声明,传递选项值:
project_dependencies = [ dependency('mysub', fallback : ['mysub', 'mysub_dep'], default_options: ['avx_opt=' + get_option('avx_opt')]), ]
修改后两种传参方式都可以生效:
- 单独给子项目传参:
meson builddir -Davx_opt:mysub=avx512 - 给主项目传参自动同步:
meson builddir -Davx_opt=avx512
方案2:子项目直接读取主项目选项(仅适合子项目不会单独编译的场景)
不需要新增子项目的meson_options.txt,直接修改mysub/meson.build中读取选项的代码,指定读取父项目的选项:
avx_type = get_option('avx_opt', meson.project_parent())
其他代码问题修正
你的代码还有两处未生效/报错的问题需要同步修改:
- 子项目中定义的
build_args_avx512没有传入编译参数,修改executable配置:project_target = executable( meson.project_name(), project_source_files, install : true, c_args : build_args + build_args_avx512, link_args : '-Wl,--allow-shlib-undefined', ) declare_dependency中引用的public_headers变量未定义,改为你实际声明的project_headers或者直接引入当前目录的头文件路径:project_dep = declare_dependency( include_directories: include_directories('.'), link_with : project_target )
内容的提问来源于stack exchange,提问作者Mariano
相关产品推荐
相关产品推荐

