Windows下CLion使用CMake构建时链接器无法找到LLVM库报错
问题背景
- 参照CLion官方Clang配置教程完成了最新版CLion + MSYS Clang工具链的配置,同时参照LLVM官方Windows编译文档自行编译构建了LLVM环境。
- 项目
CMakeLists.txt配置如下:
project(SimpleProject) set(LLVM_DIR D://LLVM/build/lib/cmake/llvm) find_package(LLVM REQUIRED CONFIG) message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") include_directories(${LLVM_INCLUDE_DIRS}) separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) add_definitions(${LLVM_DEFINITIONS_LIST}) add_executable(simple-tool main.cpp) llvm_map_components_to_libnames(llvm_libs support core irreader) target_link_libraries(simple-tool ${llvm_libs})
- 运行LLVM Fibonacci示例程序时触发链接报错,报错信息如下:
ld.lld: error: undefined symbol: llvm::User::operator new(unsigned long long) >>> referenced by CMakeFiles/simple-tool.dir/main.cpp.obj:(main) ld.lld: error: undefined symbol: llvm::Function::Function(llvm::FunctionType*, llvm::GlobalValue::LinkageTypes, unsigned int, llvm::Twine const&, llvm::Module*) >>> referenced by CMakeFiles/simple-tool.dir/main.cpp.obj:(main)
- 构建时
${llvm_libs}变量展开内容为:
LLVMSupport;LLVMCore;LLVMIRReader
- 异常现象:CLion中可以正常跳转打开上述报错提及的符号定义,但链接阶段始终无法找到对应符号的实现。
故障原因
核心原因是工具链ABI不匹配:你编译LLVM时参照的是MSVC编译流程,生成的LLVM库为MSVC ABI格式;但当前CLion使用的是MSYS Clang工具链,默认采用MinGW/GNU ABI,两者的符号修饰规则、C++标准库实现、类内存布局完全不兼容,因此即使头文件可以正常解析、符号跳转正常,链接阶段也无法匹配到对应实现。
解决方法
二选一即可修复问题:
- 方案1:切换为MSVC工具链
在CLion工具链设置中切换为Visual Studio自带的MSVC编译器,保证编译项目使用的MSVC版本、编译架构、编译配置(x86/x64、Debug/Release)和你之前编译LLVM时的配置完全一致,同时对齐RTTI、异常开关等编译选项,重新构建项目即可正常链接。 - 方案2:用当前MSYS Clang工具链重编LLVM
放弃之前用MSVC编译的LLVM包,在MSYS2环境下使用当前项目所用的Clang编译器重新编译完整LLVM工程。编译时注意对齐和项目一致的编译选项:如果项目开启了RTTI和异常,需要在LLVM的CMake配置中添加-DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON参数。编译完成后将LLVM_DIR指向新编译产物中LLVM的cmake配置目录,重新加载CMake项目即可。
注意:LLVM默认编译配置会关闭RTTI和C++异常,如果你的项目没有主动关闭这两个特性,哪怕工具链完全一致,也会因为选项不匹配出现链接错误。
内容的提问来源于stack exchange,提问作者V. Govorov
相关产品推荐
相关产品推荐

