Windows10下使用CMake构建链接ANTLR4 C++ Runtime报错如何解决
问题原因
- CMake版本较高触发了CMP0114策略警告,不影响运行但可以显式配置消除
- 仅引入了
ExternalAntlr4Cpp.cmake,未引入语法生成宏对应的配置文件,导致antlr4cpp_process_grammar函数找不到 - ANTLR运行时拉取版本未锁定,可能和本地使用的4.9.2版本jar包不兼容
- 依赖目标名称写错,
ExternalAntlr4Cpp.cmake生成的运行时目标为antlr4_runtime,不存在antlr4cpp目标
解决方案
分两种场景按需选择:
场景1:使用CMake自动生成语法解析代码
修改你的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.5) # 消除CMP0114警告 if(POLICY CMP0114) cmake_policy(SET CMP0114 NEW) endif() project(project) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set(CMAKE_CXX_STANDARD 14) # 锁定ANTLR版本和本地jar包一致 set(ANTLR4_TAG "4.9.2" CACHE STRING "ANTLR4 version tag to use") set(ANTLR4CPP_JAR_LOCATION ${PROJECT_SOURCE_DIR}/lib/antlr-4.9.2-complete.jar) include(ExternalAntlr4Cpp) # 引入语法生成宏配置 include(${PROJECT_BINARY_DIR}/antlr4cpp-generator.cmake) include_directories(${ANTLR4CPP_INCLUDE_DIRS}) link_directories(${ANTLR4CPP_LIBRARY_DIR}) # 处理语法文件生成代码 antlr4cpp_process_grammar(demo test_main ${CMAKE_CURRENT_SOURCE_DIR}/Language1/Language1.g4) include_directories(${antlr4cpp_include_dirs_test_main}) add_executable(TestMain compiler-src/TestMain.cpp ${antlr4cpp_src_files_test_main}) # 修正依赖目标名称 add_dependencies(TestMain antlr4_runtime antlr4cpp_generation_test_main) target_link_libraries(TestMain antlr4-runtime)
修改完成后删除原有build目录,重新执行构建命令即可。
场景2:直接使用你手动生成的语法解析代码
无需调用语法生成宏,修改CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.5) if(POLICY CMP0114) cmake_policy(SET CMP0114 NEW) endif() project(project) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set(CMAKE_CXX_STANDARD 14) set(ANTLR4_TAG "4.9.2" CACHE STRING "ANTLR4 version tag to use") set(ANTLR4CPP_JAR_LOCATION ${PROJECT_SOURCE_DIR}/lib/antlr-4.9.2-complete.jar) include(ExternalAntlr4Cpp) include_directories(${ANTLR4CPP_INCLUDE_DIRS}) include_directories(${PROJECT_SOURCE_DIR}/Language1/cpp) link_directories(${ANTLR4CPP_LIBRARY_DIR}) # 直接添加手动生成的语法解析代码 add_executable(TestMain compiler-src/TestMain.cpp Language1/cpp/Language1BaseListener.cpp Language1/cpp/Language1Lexer.cpp Language1/cpp/Language1Listener.cpp Language1/cpp/Language1Parser.cpp ) add_dependencies(TestMain antlr4_runtime) target_link_libraries(TestMain antlr4-runtime)
注意事项
- Windows平台编译完成后,如果使用动态链接的ANTLR运行时,需要将生成的
antlr4-runtime.dll拷贝到TestMain.exe同级目录才能正常运行 - 两种方案都需要删除原有
build目录后重新执行cmake ..,避免缓存导致的配置异常
内容的提问来源于stack exchange,提问作者user3834847
相关产品推荐
相关产品推荐

