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

如何通过CMake生成Flex&Bison目标?SQL解析器构建报错求助

问题分析

错误核心原因:

  • CMake子目录变量默认是局部作用域,src目录无法直接访问parser子目录中bison_target和flex_target生成的BISON_RawParser_OUTPUTS、FLEX_RawScanner_OUTPUTS变量
  • 未建立main.c编译与Flex/Bison文件生成的依赖关系,导致编译main.c时parse.tab.h还未生成
解决方案

通过在parser子目录创建库目标,将Flex/Bison生成的代码封装到库中,既解决变量作用域问题,又自动处理依赖顺序和包含路径,同时保证生成文件输出到build/src/parser目录。

1. 修改parser目录的CMakeLists.txt

将Flex/Bison生成的文件打包为静态库,并暴露头文件包含目录:

find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)

bison_target(RawParser
    parse.y
    ${CMAKE_CURRENT_BINARY_DIR}/parse.tab.c
    DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parse.tab.h
)

flex_target(RawScanner
    scan.l
    ${CMAKE_CURRENT_BINARY_DIR}/scan.yy.c
)

add_flex_bison_dependency(RawScanner RawParser)

# 创建静态库包含生成的源文件
add_library(sql_parser STATIC
    ${BISON_RawParser_OUTPUTS}
    ${FLEX_RawScanner_OUTPUTS}
)

# 让链接该库的目标自动获取头文件目录
target_include_directories(sql_parser PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR}
)

2. 修改src目录的CMakeLists.txt

简化配置,直接链接parser子目录的库:

add_subdirectory(parser)

add_executable(demo main.c)

# 链接parser库,自动处理头文件路径和依赖顺序
target_link_libraries(demo PRIVATE sql_parser)

3. 根目录CMakeLists.txt保持不变

cmake_minimum_required( VERSION 3.22.1 )
project( MyDB )
add_subdirectory( src )
验证步骤

清理build目录后重新构建:

rm -rf build/*
cd build
cmake ..
make

此时Flex/Bison会先在build/src/parser生成parse.tab.c、parse.tab.h、scan.yy.c,再编译静态库,最后编译main.c,不会再出现头文件缺失的错误。

内容的提问来源于stack exchange,提问作者Xiaobo Jia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:22:38