问题描述
Windows环境下,不论是手动安装,或者使用scoop,或者choco来安装cmake,以及mingw的编译器,满足了以下条件:
- cmake、gcc、g++都可以在环境中找到
- 可以直接使用vscode插件运行源代码
- 不能使用
cmake ..
构建,提示错误:
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
问题原因
原因是,在下面这些情况中,使用cmake命令的时候,cmake都看不到系统路径中的编译器路径,所以一直要求用户手动指定:
- 在cmakelists.txt中指定:
set(CMAKE_C_COMPILER "path/to/c/compiler")
set(CMAKE_CXX_COMPILER "path/to/c++/compiler")
- 在命令行
cmake ..
后面加上路径参数
可以发现,不论哪种方式,都不够优雅,无法像在Linux环境下一样简单优雅,所以想着解决一下这个问题
更进一步了解
cmake是一个跨平台构建工具,也就是说,可以生成不同平台的目标构建文件,我们来看cmake官网:https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
- 一个中文教程:https://modern-cmake-cn.github.io/Modern-CMake-zh_CN/chapters/basics.html
介绍了几种生成器: - 命令行
- makefile(包括了nmake,mingw,msys),默认是nmake,也就是出问题所在,下面详细介绍
- ninja
- IDE集成
- VS
- 其他
下载Windows版本的cmake,cmake自己会使用nmake
生成器:
NMake Makefiles是CMake支持的一种生成器,它是用于Windows平台的Makefile生成器。与其他生成器相比,NMake Makefiles有以下几个区别:
1. 平台限制:NMake Makefiles只能在Windows平台上使用,而其他生成器可以在多个平台上使用。
2. 构建工具:NMake Makefiles使用Microsoft Visual C++的nmake工具来构建项目,而其他生成器使用不同的构建工具,如Make、Ninja等。
3. 构建速度:NMake Makefiles的构建速度相对较慢,因为它使用的是Microsoft Visual C++的nmake工具,而其他生成器使用的构建工具可能会更快。
4. IDE支持:NMake Makefiles不支持集成开发环境(IDE)的直接使用,而其他生成器可以与多个IDE集成,如Visual Studio、Xcode等。
总的来说,NMake Makefiles适用于在Windows平台上使用Microsoft Visual C++的nmake工具构建项目的情况,而其他生成器则更加通用,可以在多个平台上使用,并且可以与多个IDE集成。
简单来说,这个生成器就是用于Windows平台的Makefile生成器,会自己去找MSVC的编译器,所以不论你安装了mingw或者是msys2,都无法找到默认编译器,所以造成了需要手动配置的情况
可以通过指定生成器的方式来解决,但是不够优雅,解决方案见下,推荐使用msys2安装cmake
问题解决
使用msys2,因为默认使用了ninja生成器
运行 CMake 配置命令时,建议使用选项显式指定所需的构建文件生成器-G。MSYS2 为 Ninja 提供了 CMake 默认值(但这不是上游 CMake 中的默认值,因此显式指定它是最安全的)
以msys2为例:
- 使用scoop、choco、winget,或者手动安装exe,成功安装msys2
- 在msys2的ucrt64 shell下,运行:
# 更全,vscode推荐
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
# 更少,msys2官网
pacman -S mingw-w64-ucrt-x86_64-gcc
- 通过msys2安装cmake:
pacman -S mingw-w64-ucrt-x86_64-cmake
但是这个默认是使用ninja编译的,不指定参数的话,就生产了ninja文件,而不是make文件;如果不希望msys2使用ninja,可以参考:https://blog.csdn.net/qq_45510888/article/details/132753462
参考资料
- 常用msys2命令(以cmake为例):
# 搜索
pacman -Ss cmake
# 安装
pacman -S cmake
# 搜索已安装
pacman -Qs cmake
# 卸载
pacman -R cmake