如何通过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
相关产品推荐
相关产品推荐

