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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:30