Windows10下CMake+MinGW64+Clang++编译报错:误引MSVC标准库
解决Clang++编译时错误引用MSVC标准库的问题
问题背景
在Windows 10环境中,使用Clang++ 10.0、CMake 3.10.1、MinGW x86_64 8.1.0编译C++项目:
- CMake配置阶段执行成功,但
make编译时触发错误,Clang错误引用了MSVC的C++标准库头文件,触发版本兼容断言(要求Clang 16.0.0+,但实际使用的是10.0版本) - 已指定MinGW目标并将MinGW、LLVM目录加入环境变量,问题仍未解决
执行的CMake命令
cmake ../ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_COMPILER_TARGET=x86_64-pc-windows-gnu -DCMAKE_C_COMPILER_TARGET=x86_64-pc-windows-gnu -DCMAKE_MAKE_PROGRAM=make -DCMAKE_GENERATOR="MinGW Makefiles" -DCMAKE_RC_COMPILER=make
CMake配置日志
-- The C compiler identification is Clang 10.0.0 with GNU-like command-line -- The CXX compiler identification is Clang 10.0.0 with GNU-like command-line -- Check for working C compiler: D:/LLVM/bin/clang.exe -- Check for working C compiler: D:/LLVM/bin/clang.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: D:/LLVM/bin/clang++.exe -- Check for working CXX compiler: D:/LLVM/bin/clang++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: D:/workspace/CompileTest/build
make报错日志
Scanning dependencies of target CC_COMPILE_02 [ 14%] Building CXX object CMakeFiles/CC_COMPILE_02.dir/main.cpp.obj In file included from D:\workspace\CompileTest\main.cpp:1: In file included from C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include\iostream:9: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include\yvals_core.h:847:1: error: static_assert failed "Error in C++ Standard Library usage." _EMIT_STL_ERROR(STL1000, "Unexpected compiler version, expected Clang 16.0.0 or newer."); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include\yvals_core.h:502:5: note: expanded from macro '_EMIT_STL_ERROR' static_assert(false, "Error in C++ Standard Library usage.") ^ ~~~~~ 1 error generated. make[2]: *** [CMakeFiles\CC_COMPILE_02.dir\build.make:62: CMakeFiles/CC_COMPILE_02.dir/main.cpp.obj] Error 1 make[1]: *** [CMakeFiles\Makefile2:75: CMakeFiles/CC_COMPILE_02.dir/all] Error 2 make: *** [Makefile:83: all] Error 2
原始CMakeLists.txt
cmake_minimum_required(VERSION 3.10) # set(CMAKE_C_COMPILER_TARGET "x86_64-pc-windows-gnu") # set(CMAKE_CXX_COMPILER_TARGET "x86_64-pc-windows-gnu") # set(CMAKE_C_COMPILER "D:/LLVM/bin/clang.exe") # set(CMAKE_CXX_COMPILER "D:/LLVM/bin/clang++.exe") project(CC_COMPILE_02) #add_compile_options(-target x86_64-pc-windows-gnu) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "-g") add_executable(CC_COMPILE_02 main.cpp Tokens/LexerToken.cpp Tokens/LexerToken.h Lexer/Lexer.cpp Lexer/Lexer.h Parser/Parser.cpp Parser/Parser.h Tokens/AbstractToken.cpp Tokens/AbstractToken.h Tokens/ParserToken.cpp Tokens/ParserToken.h Exceptions/CompileException.h Symbol/AbstractSymbol.h Symbol/SymbolTable.h Symbol/IntentSymbol.h Symbol/ArraySymbol.h Symbol/FuncSymbol.h Symbol/SymbolTableController.h)
关键错误分析
- Clang在Windows环境下默认优先搜索MSVC标准库路径(若系统安装Visual Studio),CMake 3.10.1对Clang的GNU目标支持不完善,未自动切换到MinGW标准库
- CMake命令错误设置
CMAKE_RC_COMPILER=make,资源编译器应为MinGW的windres.exe,该错误会导致配置异常 - 未强制指定MinGW标准库的头文件和链接路径,Clang仍会回退到MSVC库
解决方案
1. 修正CMake命令
替换错误的资源编译器配置,添加强制指定标准库的参数(替换<MinGW路径>为实际安装路径):
cmake ../ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_COMPILER_TARGET=x86_64-pc-windows-gnu -DCMAKE_C_COMPILER_TARGET=x86_64-pc-windows-gnu -DCMAKE_MAKE_PROGRAM=make -DCMAKE_GENERATOR="MinGW Makefiles" -DCMAKE_RC_COMPILER=windres -DCMAKE_CXX_FLAGS="-nostdinc++ -I<D:/MinGW/x86_64-w64-mingw32/include/c++/8.1.0> -I<D:/MinGW/x86_64-w64-mingw32/include> -L<D:/MinGW/x86_64-w64-mingw32/lib>"
-nostdinc++:禁用Clang默认的C++标准库头文件搜索路径-I:手动添加MinGW的C++标准库头文件路径-L:手动添加MinGW的库文件链接路径
2. 修改CMakeLists.txt
取消注释相关配置,添加MinGW标准库的路径指定:
cmake_minimum_required(VERSION 3.10) set(CMAKE_C_COMPILER_TARGET "x86_64-pc-windows-gnu") set(CMAKE_CXX_COMPILER_TARGET "x86_64-pc-windows-gnu") set(CMAKE_C_COMPILER "D:/LLVM/bin/clang.exe") set(CMAKE_CXX_COMPILER "D:/LLVM/bin/clang++.exe") set(CMAKE_RC_COMPILER "windres") project(CC_COMPILE_02) add_compile_options(-target x86_64-pc-windows-gnu -nostdinc++) # 指定MinGW标准库头文件路径 include_directories("D:/MinGW/x86_64-w64-mingw32/include/c++/8.1.0") include_directories("D:/MinGW/x86_64-w64-mingw32/include/c++/8.1.0/x86_64-w64-mingw32") include_directories("D:/MinGW/x86_64-w64-mingw32/include") # 指定MinGW标准库链接路径 link_directories("D:/MinGW/x86_64-w64-mingw32/lib") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "-g") add_executable(CC_COMPILE_02 main.cpp Tokens/LexerToken.cpp Tokens/LexerToken.h Lexer/Lexer.cpp Lexer/Lexer.h Parser/Parser.cpp Parser/Parser.h Tokens/AbstractToken.cpp Tokens/AbstractToken.h Tokens/ParserToken.cpp Tokens/ParserToken.h Exceptions/CompileException.h Symbol/AbstractSymbol.h Symbol/SymbolTable.h Symbol/IntentSymbol.h Symbol/ArraySymbol.h Symbol/FuncSymbol.h Symbol/SymbolTableController.h)
3. 调整环境变量优先级
- 将MinGW的
bin目录(如D:/MinGW/bin)移到系统PATH环境变量的最前端,确保优先于Visual Studio的相关路径 - 重启终端后再执行构建命令,避免环境变量缓存问题
4. 清理旧构建文件
删除build目录下所有文件,重新执行修正后的CMake命令,再运行make
验证
执行make后,查看编译日志,若头文件路径显示为MinGW的路径(如D:/MinGW/.../iostream),则说明配置生效,错误将消失。
内容的提问来源于stack exchange,提问作者c.c
相关产品推荐
相关产品推荐

