-g 选项在 cmake 命令行中指定生成器,不可写入 cmakelists.txt;运行 cmake -g(无参数)可列出当前环境支持的生成器,默认项标有 *;生成器选定后需确保对应构建工具(如 ninja、vs)及编译器已就绪,且更换生成器必须清空构建目录重新配置。

cmake 命令行里用 -G 指定生成器,不是写在 CMakeLists.txt 里
生成器(Generator)是 cmake 命令执行时决定的,和 CMakeLists.txt 内容无关。你不能在 CMakeLists.txt 中用某个指令“设置生成器”,那是无效的。所有生成器选择必须发生在配置阶段(即运行 cmake 命令时)。
常见错误是试图在 CMakeLists.txt 里写类似 set(CMAKE_GENERATOR "Ninja") —— 这完全不起作用,CMake 会忽略或报错。
-
cmake -G "Unix Makefiles"(Linux/macOS 默认) -
cmake -G "Ninja"(需提前装好ninja,速度快,推荐) -
cmake -G "Visual Studio 17 2022"(Windows,注意空格和版本号要精确匹配) -
cmake -G "Xcode"(macOS 上生成 Xcode 工程)
怎么查系统上有哪些可用生成器?
直接运行 cmake -G(不带参数),它会列出所有当前环境支持的生成器,并标出默认项。输出里带 * 的是默认值,比如:
Available generators: * Unix Makefiles = Generates Standard UNIX makefiles. Ninja = Generates build.ninja files. Visual Studio 17 2022 = Generates Visual Studio 2022 project files.
注意:列表取决于你安装的构建工具。没装 ninja 就不会看到 Ninja;没装 VS 就不会有对应选项。Windows 上若装了多个 VS 版本,每个都会单独列出。
指定生成器后,为什么还会报错说找不到编译器?
生成器只决定“怎么组织构建”,不自动绑定编译器。尤其在 Windows 上,Visual Studio 生成器依赖 VS 安装路径和工作负载(如 C++ 构建工具),Ninja 或 Makefiles 则依赖 CC/CXX 环境变量或 PATH 中的 cl.exe / gcc / clang。
- 用
Visual Studio生成器时,建议从 VS 的开发者命令提示符中运行cmake,它已预置好环境变量 - 用
Ninja时,确保ninja --version可执行,且gcc或clang在 PATH 中 - 跨平台项目常用
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++显式指定,避免自动探测出错
能不能让不同平台自动选合适生成器?
不能靠 CMake 自动选,但可以封装脚本统一处理。比如写个 build.sh:
#!/bin/sh if command -v ninja >/dev/null; then cmake -G Ninja "$@" else cmake -G "Unix Makefiles" "$@" fi
或者 Windows 上用 build.bat 判断是否存在 vswhere.exe 来选 VS 版本。CMake 本身不提供平台自适应生成器切换机制——这是调用者(人或 CI 脚本)的责任。
真正容易被忽略的是:一旦某次用 -G 生成了构建目录,后续再运行 cmake(不带 -G)会复用上次的生成器,不会重新探测。想换生成器,必须删掉整个构建目录重来,否则会报错或行为异常。











