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

Windows10下使用CMake构建链接ANTLR4 C++ Runtime报错如何解决

问题原因

  1. CMake版本较高触发了CMP0114策略警告,不影响运行但可以显式配置消除
  2. 仅引入了ExternalAntlr4Cpp.cmake,未引入语法生成宏对应的配置文件,导致antlr4cpp_process_grammar函数找不到
  3. ANTLR运行时拉取版本未锁定,可能和本地使用的4.9.2版本jar包不兼容
  4. 依赖目标名称写错,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:04