编译MLIR Toy Chapter1失败,请求解决链接错误问题
编译MLIR Toy Chapter1链接错误的解决方案
问题背景
尝试编译MLIR官方Toy教程Chapter1代码,现有CMake配置如下:
cmake_minimum_required(VERSION 3.20) project(mlir-toy VERSION 0.0.0) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED YES) find_package(MLIR REQUIRED CONFIG) list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}") list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(TableGen) include(AddLLVM) include(AddMLIR) include(HandleLLVMOptions) set(MLIRTOY_SRC_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) include_directories(${LLVM_INCLUDE_DIRS} ${MLIR_INCLUDE_DIRS} ${MLIRTOY_SRC_INCLUDE_DIR}) add_executable(mlir-toy src/main.cpp src/AST.cpp) target_link_libraries(mlir-toy PRIVATE MLIRSupport)
编译时触发链接错误:
/usr/bin/ld: CMakeFiles/mlir-toy.dir/src/main.cpp.o:(.data.rel.ro._ZTIN4llvm2cl3optIN12_GLOBAL__N_16ActionELb0ENS0_6parserIS3_EEEE+0x18): undefined reference to `typeinfo for llvm::cl::Option' /usr/bin/ld: CMakeFiles/mlir-toy.dir/src/main.cpp.o:(.data.rel.ro._ZTIN4llvm2cl6parserIN12_GLOBAL__N_16ActionEEE+0x10): undefined reference to `typeinfo for llvm::cl::generic_parser_base' /usr/bin/ld: CMakeFiles/mlir-toy.dir/src/main.cpp.o:(.data.rel.ro._ZTIN4llvm2cl15OptionValueCopyIN12_GLOBAL__N_16ActionEEE+0x10): undefined reference to `typeinfo for llvm::cl::GenericOptionValue' clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed.
环境信息:
- clang++版本:
Ubuntu clang version 17.0.6 (++20231128094036+6009708b4367-1~exp1~20231128094051.72) - 已自行编译并安装MLIR到本地
mlir-toy/install目录
解决方案
错误原因是代码使用了LLVM命令行解析组件(llvm::cl),但未链接对应的LLVMSupport库。修改CMakeLists.txt的链接库配置,添加LLVMSupport:
cmake_minimum_required(VERSION 3.20) project(mlir-toy VERSION 0.0.0) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED YES) find_package(MLIR REQUIRED CONFIG) list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}") list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(TableGen) include(AddLLVM) include(AddMLIR) include(HandleLLVMOptions) set(MLIRTOY_SRC_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) include_directories(${LLVM_INCLUDE_DIRS} ${MLIR_INCLUDE_DIRS} ${MLIRTOY_SRC_INCLUDE_DIR}) add_executable(mlir-toy src/main.cpp src/AST.cpp) # 补充LLVMSupport库以解决命令行解析相关的链接错误 target_link_libraries(mlir-toy PRIVATE MLIRSupport LLVMSupport)
关键说明
LLVMSupport包含了llvm::cl系列类的实现,缺失该库会导致类型信息和函数符号无法找到。- 若后续编译还出现其他MLIR组件的链接问题,可参考官方Toy教程的CMake配置,添加对应依赖库(如
MLIRIR、MLIRParser等)。
内容的提问来源于stack exchange,提问作者Ustinian
相关产品推荐
相关产品推荐

