Meson配置阶段调用flatc报错,如何在此阶段编译FlatBuffers Schema?
在Meson配置阶段执行wrap引入的flatc编译FlatBuffers Schema的解决方案
问题场景
使用Meson构建系统,通过WrapDB引入flatbuffers后,尝试在配置阶段获取flatc并执行时触发报错:
ERROR: Program 'flatc' was overridden with the compiled executable 'flatc' and therefore cannot be used during configuration
相关代码
meson.build
dependency('flatbuffers') flatc = find_program('flatc') run_command(flatc, '--version', check: true) # 触发报错
flatbuffers.wrap(来自WrapDB)
[wrap-file] directory = flatbuffers-24.3.6 source_url = https://github.com/google/flatbuffers/archive/v24.3.6.tar.gz source_filename = flatbuffers-24.3.6.tar.gz source_hash = 5d8bfbf5b1b4c47f516e7673677f0e8db0efd32f262f7a14c3fd5ff67e2bd8fc patch_filename = flatbuffers_24.3.6-1_patch.zip patch_url = https://wrapdb.mesonbuild.com/v2/flatbuffers_24.3.6-1/get_patch patch_hash = bc0e1035a67ae74b1f862491fe2b0fd49b2889d989508143fff0a45508421bd7 source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/flatbuffers_24.3.6-1/flatbuffers-24.3.6.tar.gz wrapdb_version = 24.3.6-1 [provide] flatbuffers = flatbuffers_dep program_names = flatc, flathash
环境信息
- meson v1.3.2
- fedora 39
报错原因
wrap配置中program_names声明flatc是编译生成的可执行文件,在Meson的配置阶段,该程序还未被编译出来,因此无法直接调用。
解决方案
方案1:强制使用系统已安装的flatc(配置阶段可用)
如果必须在配置阶段执行flatc,可以让Meson优先查找系统中已安装的原生版本,绕过wrap编译的版本:
# 优先查找系统原生flatc,找不到则配置失败 flatc = find_program('flatc', native: true, allow_fallback: false) run_command(flatc, '--version', check: true)
注意:这种方式要求用户提前在系统中安装flatbuffers,否则配置会直接失败。
方案2:改用构建阶段执行(推荐,兼容wrap场景)
将flatc的调用放到构建阶段,用custom_target处理Schema编译,这是Meson推荐的方式——此时wrap编译的flatc已生成,可以正常调用:
fb_dep = dependency('flatbuffers') flatc = find_program('flatc') # 在构建阶段编译FlatBuffers Schema schema_target = custom_target( 'compile_fb_schema', input: 'your_schema.fbs', # 替换为你的schema文件 output: 'your_schema_generated.h', # 生成的头文件名 command: [ flatc, '--cpp', # 根据需要调整生成语言参数 '-o', meson.current_build_dir(), '@INPUT@' ], depends: fb_dep, install: false # 根据需求设置是否安装生成文件 ) # 将生成的头文件关联到你的编译目标 executable( 'your_app', 'main.cpp', dependencies: fb_dep, include_directories: meson.current_build_dir(), sources: schema_target )
方案3:兼容配置阶段检查与wrap编译
如果需要在配置阶段做版本检查,同时兼容wrap场景,可以先尝试查找系统flatc,找不到则跳过检查:
flatc = find_program('flatc', native: true, required: false) if flatc.found() run_command(flatc, '--version', check: true) else warning('系统未安装flatc,配置阶段跳过版本检查,将使用wrap编译的版本在构建阶段处理schema') endif # 后续用custom_target在构建阶段处理schema编译(同方案2)
内容的提问来源于stack exchange,提问作者Sanito Gonzalez
相关产品推荐
相关产品推荐

