CMake在Windows上默认选用MSVC(cl.exe)是因为其默认生成器为Visual Studio系列(如“Visual Studio 17 2022”),该生成器专为MSBuild设计,仅识别cl.exe,完全忽略PATH中的gcc/clang;即使已安装MinGW-w64并配置PATH,cmake ..仍自动生成.sln工程而非Makefile,导致mingw32-make无法使用。

Windows 下 CMake 默认会选 MSVC(cl.exe),想用 GCC/Clang 就必须显式干预,否则生成的构建文件根本没法用 make 或 mingw32-make 编译。
为什么 cmake .. 会自动用 MSVC?
CMake 在 Windows 上默认绑定 Visual Studio 生成器(如 Visual Studio 16 2019),它只认 cl.exe,完全忽略 PATH 里的 gcc.exe 或 clang++.exe。即使你装了 MinGW-w64 并加进 PATH,cmake .. 依然走 MSVC 路径 —— 这不是 bug,是设计行为。
常见错误现象:
- 执行 cmake .. 后看到 -- Building for: Visual Studio ...
- 构建目录里没生成 Makefile,只有 .sln 和 .vcxproj
- 后续执行 mingw32-make 报错:找不到目标或命令未识别
- 根本原因不是编译器没装,而是生成器(generator)没指定
- 生成器决定底层构建系统(MSBuild / Make / Ninja),也锁定了可用的编译器族
- 仅靠设置
CMAKE_CXX_COMPILER变量无法绕过生成器限制(尤其对 MSVC 生成器)
指定 MinGW-w64 编译器的正确姿势
必须同时指定生成器和编译器路径,缺一不可。推荐组合:
- 用
-G "MinGW Makefiles"强制走 MinGW 构建路径(生成Makefile) - 再用
-D CMAKE_CXX_COMPILER显式指向你的g++.exe(避免 CMake 自己瞎猜)
完整命令示例(假设 MinGW-w64 安装在 D:\mingw64):
cmake -G "MinGW Makefiles" -D CMAKE_CXX_COMPILER="D:/mingw64/bin/g++.exe" -D CMAKE_C_COMPILER="D:/mingw64/bin/gcc.exe" ..
注意:
- -G 参数必须放在最前面,否则 CMake 可能先按默认生成器初始化,再覆盖失败
- 路径中不能有空格,否则需用引号包裹(但 Windows 路径建议用正斜杠 / 避免转义问题)
- 不要依赖 CC/CXX 环境变量:它们在 Windows 下对 MSVC 生成器无效,且易被其他工具污染
VS 里用 Clang 怎么配?
Visual Studio 自带 clang-cl(Clang 的 MSVC 兼容模式),不用额外装编译器,但必须改工具集:
- 右键
CMakeLists.txt→ “CMake 设置” → 新建或编辑配置 - 在“常规”页,“工具集”下拉选
ClangCL(不是LLVM或clang++) - 如果要用自定义 Clang(比如独立安装的 LLVM),在“CMake 变量和缓存”里设:
CMAKE_CXX_COMPILER=C:/Program Files/LLVM/bin/clang++.exeCMAKE_C_COMPILER=C:/Program Files/LLVM/bin/clang.exe
关键点:
- clang-cl.exe 是 VS 默认集成的,兼容 MSVC 标准库和头文件路径
- 直接用 clang++.exe 会链接 libc++,可能触发 undefined reference to __libc_init 类错误
- 工具集切换后,VS 自动生成的 CMakeCache.txt 里会写入对应编译器路径,无需手动传参
验证编译器是否真生效了
光看 cmake 输出不够,得检查实际生成的构建逻辑:
- 运行
cmake --build . --verbose,观察第一行调用的是cl.exe还是g++.exe - 打开
CMakeCache.txt,搜索CMAKE_CXX_COMPILER:,确认值是你指定的路径 - 对 MinGW 项目,检查
build/Makefile里CXX =行是否匹配你设的g++.exe
容易忽略的坑:
- CMake 缓存不自动清除:换编译器前务必删掉整个 build/ 目录,否则旧缓存会覆盖新参数
- 混用生成器和编译器:比如用 -G "Ninja" 却没装 Ninja,或用 -G "Unix Makefiles" 却在 Windows 上跑 —— 会报 Generator not supported
- 路径权限问题:某些杀毒软件会拦截 g++.exe 调用,表现为编译中途静默失败


















