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

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)

关键错误分析

  1. Clang在Windows环境下默认优先搜索MSVC标准库路径(若系统安装Visual Studio),CMake 3.10.1对Clang的GNU目标支持不完善,未自动切换到MinGW标准库
  2. CMake命令错误设置CMAKE_RC_COMPILER=make,资源编译器应为MinGW的windres.exe,该错误会导致配置异常
  3. 未强制指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:55