ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows下CMake 3.29.3安装配置与避坑指南

Windows下CMake 3.29.3安装配置与避坑指南 简介CMake 3.29.3 的 Windows x86_64 预编译版面向 C/C 开发者用于跨平台构建管理。它不直接编译而是为 Visual Studio、Ninja 或 Makefile 生成构建输入适合维护多平台项目的开发者或构建系统初学者。压缩包内含 2000 个文件其中 1157 个 txt 文本与 843 个 HTML 页面构成完整的官方文档与命令行帮助体系涵盖 cmake 命令参考、生成器表达式、构建系统手册、预设与变量说明包体约 43.63MB便于离线查阅。已有 1026 人学习下载。解压后即可获得可直接运行的 cmake 程序及配套文档无需自行编译源码。借助这套工具可清晰管理编译选项、依赖关系与头文件目录降低多平台构建切换成本文档中亦包含生成器表达式、构建系统规范等进阶内容适合从入门到中高级开发者按需查阅。1. 为什么我最后选了 cmake-3.29.3-windows-x86-64在 Windows 上编译 C 项目最糟心的从来不是代码本身而是构建系统。拿一个开源库下来README 写着「mkdir build cd build cmake .. make」你在 Linux 上三分钟跑完换到 Windows 就变成一场灾难——VS 的解决方案文件长什么样、MinGW 的 make 能不能用、链接器怎么找库每个问题都能耗掉半天。CMake 是绕不开的那层壳它把「生成什么构建文件」这件事从人手里接管过去让你只写一份 CMakeLists.txt剩下的交给生成器。这份资源就是 CMake 3.29.3 的 Windows x86-64 安装包解决的是「Windows 上装一个能稳定出构建文件的 CMake」这个最基础也最关键的问题。它适合三类人要编译第三方 C 库的在用 VSCode 或 CLion 写 C 的以及被 Qt 或者 OpenCV 的 configure 步骤折磨过的人。本篇把我从下载安装到实际跑通项目的完整过程展开讲一遍重点放在那些你不撞一次不会信的坑上。2. 把安装包装明白安装器选项与 PATH 才是第一个坎2.1 下载与安装三个选项怎么勾cmake-3.29.3-windows-x86-64 提供的是 Windows 平台的 64 位安装包下载下来是一个 .msi 或者 .zip。MSI 是官方推荐方式因为安装向导会帮你处理 PATH 和注册表ZIP 版适合想完全手动控制的人比如公司电脑没有管理员权限时。双击 MSI 后安装向导走到「Install Options」这一步会出现三个复选框Add CMake to the system PATH for all users这个必须勾。很多人在命令行里输入cmake提示「不是内部或外部命令」就是这个复选框没勾。Create CMake Desktop Icon可勾可不勾纯粹是个快捷方式。Create Start Menu shortcuts默认勾上不影响任何功能。装完之后建议顺手把「Advanced」选项里的安装路径看清楚。默认是C:\Program Files\CMake如果你后面要写脚本批量调用 CMake路径里有空格会带来额外麻烦。我一般会改成C:\CMake少一个空格少一类玄学问题。ZIP 版的逻辑不一样解压到一个目录后需要手动把bin目录加进系统环境变量。右键「此电脑」→「属性」→「高级系统设置」→「环境变量」在「Path」里新建一条填你解压的路径比如D:\dev\cmake-3.29.3-windows-x86-64\bin。2.2 验证安装cmake --version 前先检查两件事装完第一件事是打开一个新的命令提示符窗口运行cmake --version注意一定要开新窗口。Windows 的环境变量改动不会实时同步到已经打开的终端里你如果装完直接回头用旧窗口敲命令八成还是提示找不到命令。这不是安装失败是终端没刷新环境变量。正常输出长这样cmake version 3.29.3 CMake suite maintained and supported by Kitware (kitware.com/cmake).看到 3.29.3 就说明安装没问题。如果提示找不到命令按顺序排查三步确认安装向导里「Add CMake to PATH」勾了没有确认装的是 user 级别还是 system 级别当前用户有没有权限读系统变量手动打开环境变量编辑器看 Path 里有没有C:\Program Files\CMake\bin或者你手动加的那条。接着运行cmake --help这个命令会列出当前环境所有可用的生成器。输出前半部分是通用说明不用细看重点看后半段The following generators are available on this platform: Visual Studio 17 2022 Visual Studio 16 2019 Visual Studio 15 2017 MinGW Makefiles Ninja Unix Makefiles如果 Visual Studio 系列生成器不全说明系统里没有装对应的 VS 版本如果 MinGW Makefiles 不在列表里说明 MinGW 的 bin 目录没加进 PATH。这是后续所有问题的根源——CMake 本身只是个调度器真正干活的是编译器编译器找不到CMake 就报错。2.3 编译器与生成器的选型MSVC 和 MinGW 不要混这一步最容易被忽略却是后面所有坑的总根源。CMake 是一个「生成器」概念的工具它不直接编译而是根据你选的生成器生成对应的构建文件。Windows 上常见组合有三套组合生成器参数编译产物适用场景Visual Studio MSVC-G Visual Studio 17 2022.sln / .vcxproj团队协作、Windows 原生开发MinGW GCC-G MinGW MakefilesMakefile轻量项目、不想装 VSNinja 任意编译器-G Ninjabuild.ninja增量编译最快、CI 环境一个非常常见的翻车操作是系统里装了 MinGW代码里用了 GCC 特有的扩展语法然后你拿 Visual Studio 生成器去构建报一堆语法错误反过来也一样用 MSVC 编译出来的 .lib 想让 MinGW 链接会直接报「file format not recognized」。更麻烦的是 Qt 自带的和 CMake 自带的不一致。很多人在 Windows 上装 Qt 时选了 msvc2017_64 套件但系统 PATH 里排在前面的却是 MinGW 的 gcc.exeCMake 检测编译器时就会「看走眼」最后生成出来的构建文件调用错了编译器。我一般这样确认当前环境where cl where gcc where g一个干净的 Windows C 开发环境应该只有一个编译器在 PATH 里至少优先级上要能区分。如果where gcc同时输出了 Qt 目录下的 gcc 和 MinGW 的 gcc后患无穷。遇到这种环境直接改 PATH把不需要的编译器目录挪出去。避坑核心就一句话先确定自己要用哪套工具链再决定 CMake 生成器参数不要指望 CMake 帮你猜。3. 从零跑通一个 C 项目CMakeLists.txt 与命令行实战3.1 最小可编译的项目结构理论说完了落地干活。先建一个最小项目目录结构如下demo/ ├── CMakeLists.txt └── main.cppmain.cpp 写一个最简单的程序#include iostream int main() { std::cout cmake 3.29.3 on windows works std::endl; return 0; }CMakeLists.txt 是这个项目的核心我把它完整写出来然后逐行解释cmake_minimum_required(VERSION 3.20) project(cmake_demo CXX) add_executable(demo main.cpp) if(MSVC) target_compile_options(demo PRIVATE /W4) else() target_compile_options(demo PRIVATE -Wall -Wextra) endif()这段文件做了四件事声明最低 CMake 版本、声明项目名和语言、声明可执行文件的源文件、按编译器类型设置警告选项。cmake_minimum_required(VERSION 3.20)这段的作用是锁版本下限。CMake 3.29.3 是能向下兼容的但你写在文件里的语法得保证旧版本也能识别。project(cmake_demo CXX)里的CXX表示这个项目只用 C不参与 C 语言的编译检测能让 configure 阶段少跑一些没必要的检查。add_executable(demo main.cpp)就是字面意思把 main.cpp 编成名为 demo.exe 的可执行文件。最后那个if(MSVC)是平台判断MSVC 的警告参数是/W4GCC 和 Clang 是-Wall -Wextra分开写是为了两边都不报警告。3.2 用命令行生成并构建configure 与 build 分开做进入项目目录开始构建。核心原则是「源码目录和构建目录分离」不要在项目根目录直接跑 cmake 生成一堆垃圾文件。我一般这样操作cd D:\work\demo cmake -S . -B build -G Visual Studio 17 2022 -A x64-S .指定源码根目录-B build指定构建目录这两参数是 CMake 3.13 之后推荐的显式写法比老式的cmake ..更清晰。-G指定生成器-A x64显式指定 64 位架构这个在 Visual Studio 生成器下尤为重要不指定的话默认走 Win32后面链接第三方 64 位库会全是 LNK1112 之类的错误。如果用的是 MinGWcmake -S . -B build -G MinGW Makefiles -DCMAKE_BUILD_TYPEReleaseMinGW 这一套用的是 Makefile它不像 Visual Studio 那样天然支持多配置所以必须用-DCMAKE_BUILD_TYPERelease显式指定编译类型不然默认没有优化。configure 成功后构建目录里会生成一堆文件不用管它们接着执行编译cmake --build build --config Release--build是 CMake 提供的统一构建入口它会自动调用生成器对应的底层构建工具。Visual Studio 生成器会把--config Release映射到 MSBuild 的/p:ConfigurationReleaseMinGW 生成器则不需要--config编译类型在 configure 阶段已经定死了。构建成功后去D:\work\demo\build\ReleaseVS 生成器或者D:\work\demo\buildMinGW 生成器下面找 demo.exe执行一下看输出D:\work\demo\build\Release\demo.exe看到cmake 3.29.3 on windows works这行输出整个链路就算通了。3.3 常见的 CMake 指令与缓存变量怎么读跑通之后你迟早会遇到要引第三方库的场景。这时候最常用的一组变量要提前认识变量/参数作用示例CMAKE_PREFIX_PATH告诉 CMake 去哪找第三方库的 config 文件-DCMAKE_PREFIX_PATHD:/libs/opencvCMAKE_INSTALL_PREFIX指定 install 时安装到哪个目录-DCMAKE_INSTALL_PREFIXD:/dev/sdkCMAKE_BUILD_TYPE单配置生成器的编译类型-DCMAKE_BUILD_TYPEDebugfind_package查找并加载第三方库的 CMake 配置find_package(OpenCV REQUIRED)CMake 的查找机制是先找你要的库名比如 OpenCV然后在CMAKE_PREFIX_PATH指定的每个路径下找opencv-config.cmake或者OpenCVConfig.cmake找到就把库的 include 路径和链接路径暴露给后续的target_link_libraries。一个完整的第三方库接入例子长这样cmake_minimum_required(VERSION 3.20) project(demo_with_lib CXX) find_package(OpenCV REQUIRED) add_executable(show_image show_image.cpp) target_include_directories(show_image PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(show_image PRIVATE ${OpenCV_LIBS})这里find_package找不到库时会直接报错并停止 configure。报错信息里会写它搜索过的路径列表这是排错的第一线索。关于缓存变量的读取最直观的方式是用 CMake GUI。在安装目录里找到 cmake-gui.exe打开后第一行填源码目录第二行填构建目录点 Configure它会重新执行一遍 configure 过程所有缓存变量会以表格形式列出来。这个工具在调试第三方库路径时非常管用因为命令行的 configure 日志一滚就没了GUI 能让你看到每条变量当前的值。4. 常见问题与避坑记录这些坑我都踩过4.1 现象configure 正常build 时报找不到头文件报错长这样fatal error C1083: Cannot open include file: opencv2/opencv.hpp: No such file or directory原因find_package返回的是OpenCV_INCLUDE_DIRS但你在add_executable之前没有调用target_include_directories或者find_package压根没成功。CMake 的 include 路径和链接路径必须显式传给目标光找到包不会自动让编译器认识头文件。解决检查find_package有没有报错没报错就检查target_include_directories有没有把这个变量传进去。直接输出变量确认cmake -S . -B build --trace-sourceCMakeLists.txt或者更简单粗暴在 CMakeLists.txt 里打印message(STATUS OpenCV_INCLUDE_DIRS${OpenCV_INCLUDE_DIRS})跑一次 configure看输出有没有内容。空输出说明路径没传进来。4.2 现象configure 时报错 Qt5Config.cmake 找不到具体报错信息经常长这样CMake Error at C:/Qt/5.9.4/5.9.4/msvc2017_64/lib/cmake/Qt5/Qt5Config.cmake:... Could not find a package configuration file provided by Qt5原因你装了 Qt但 CMake 不知道 Qt 装在哪。Qt 的 CMake 配置不在 PATH 变量能覆盖的范围内必须在CMAKE_PREFIX_PATH里手动指路。报错路径里显示的路径是 CMake 按默认规则去猜的猜到了 Qt 安装根目录但没猜到具体的套件子目录。解决configure 时显式指定 Qt 的 CMake 路径cmake -S . -B build -G Visual Studio 17 2022 -A x64 -DCMAKE_PREFIX_PATHC:/Qt/5.9.4/msvc2017_64注意这里指向的是套件根目录不是lib/cmake/Qt5。CMake 的find_package(Qt5)会在CMAKE_PREFIX_PATH/lib/cmake/下面找Qt5Config.cmake。如果你的 Qt 路径写到了msvc2017_64/lib/cmake/Qt5它会再拼一层lib/cmake反而找不到。这类问题在 VSCode 里配合 CMake Tools 插件时尤其明显。状态栏的「Configure」按钮显示红色点开日志也看不出所以然往往是 CMake Tools 的cmake.configureSettings配置里没有补上CMAKE_PREFIX_PATH。在.vscode/settings.json里维护一份的话建议写成这样{ cmake.configureSettings: { CMAKE_PREFIX_PATH: C:/Qt/5.9.4/msvc2017_64 } }4.3 现象改了 CMakeLists.txt 重新 build行为还是旧的报错不会直接出现是行为不符合预期。你新增了一个源文件或者改了一个编译选项cmake --build跑完还是没有变化。原因CMake 有缓存机制。第一跑 configure 时它会记录很多变量到CMakeCache.txt后续 build 阶段不会自动重新执行 configure。你改了 CMakeLists.txt构建目录里的缓存还是旧的。最常见的是新增源文件后忘了 add_executable 里加名字或者改了-D参数后旧值还留在缓存里。解决强制重新 configure。两种方式# 方式一删掉构建目录干净重来 rm -rf build cmake -S . -B build -G Visual Studio 17 2022 -A x64 # 方式二只重新生成构建文件不删缓存 cmake -S . -B build方式一最稳妥但每次全量重编很费时间。方式二比你想象中好用的多因为 CMake 会自己判断哪些目标需要重建不会真的全部重编。我一般是先方式二如果还不对再方式一。4.4 现象链接时报 LNK1112 或找不到符号报错LNK1112: module machine type x64 conflicts with target machine type x86原因configure 阶段指定了 32 位但你链接的库是 64 位或者反过来。这个在 Visual Studio 生成器下特别容易出因为-A参数一旦写错生成的解决方案文件里所有项目都是同一个平台库不匹配就报。解决回到 configure 那一步确认-A x64写了对。如果已经 build 过删掉构建目录重新 configure。命令行确认当前架构cmake --build build --verbose输出里能看到MSBuild.exe后面跟的参数比如/p:Platformx64。如果这里写的是 Win32就把-A参数改了。4.5 现象MinGW 环境报sh.exe was found in your PATH报错CMake Error: The source directory ... does not appear to contain a CMakeLists.txt或者更经典的sh.exe was found in your PATH. For MinGW Make to work correctly sh.exe must NOT be in your PATH.原因MinGW 的 make 指令和 Git Bash 里的 sh.exe 冲突。CMake 调用 MinGW Makefiles 生成器时会在 PATH 里找 sh.exe而 Git 自带的 bash 里就有 sh.exe。这个冲突会导致 make 的 shell 指令全部失效。解决构建前临时把 Git 的 bin 目录从 PATH 里挪出去或者用 CMake 指定正确的 make 程序cmake -S . -B build -G MinGW Makefiles -DCMAKE_MAKE_PROGRAMC:/msys64/mingw64/bin/mingw32-make.exe如果只是偶尔构建临时移除 Git 的 bin 目录最快set PATHC:\msys64\mingw64\bin;%PATH%注意这句是覆盖式赋值不是追加它会暂时把 PATH 替换成 MinGW 开头的新 PATH。跑完这条再执行 cmakesh.exe 冲突就没了。5. 进阶把配置固化下来用 CMakePresets.json 避免重复踩坑命令行每次敲一大串-D参数迟早会出错。CMake 3.19 之后引入了 CMakePresets.json把 configure、build、test 的命令统一收敛到一个配置文件里。这个功能特别适合两种场景同一个项目在多个环境切换或者一个项目有 Debug/Release 等多套构建需求。在项目根目录创建一个名为CMakePresets.json的文件{ version: 6, configurePresets: [ { name: windows-vs-debug, displayName: VS 2022 x64 Debug, generator: Visual Studio 17 2022, architecture: x64, binaryDir: ${sourceDir}/build/vs-debug, cacheVariables: { CMAKE_BUILD_TYPE: Debug } }, { name: windows-mingw-release, displayName: MinGW Release, generator: MinGW Makefiles, binaryDir: ${sourceDir}/build/mingw-release, cacheVariables: { CMAKE_BUILD_TYPE: Release, CMAKE_MAKE_PROGRAM: C:/msys64/mingw64/bin/mingw32-make.exe } } ], buildPresets: [ { name: vs-debug, configurePreset: windows-vs-debug, configuration: Debug }, { name: mingw-release, configurePreset: windows-mingw-release } ] }这个文件不是给 CMake 看的是给你的命令行看的。写完以后原来的长命令变成cmake --preset windows-vs-debug cmake --build --preset vs-debug换 MinGW 编译时只需要换 preset 名cmake --preset windows-mingw-release cmake --build --preset mingw-release${sourceDir}是 CMake 内置的变量指向 CMakePresets.json 所在的目录相当于自动填了-S参数。binaryDir指定构建目录比如build/vs-debug这样 VS 和 MinGW 两套构建产物完全隔离不会互相污染 CMakeCache.txt。还有一个重要用法是让CMakePresets.json覆盖第三方库路径。之前踩过 Qt 的坑这里直接固化{ name: qt-demo, generator: Visual Studio 17 2022, architecture: x64, binaryDir: ${sourceDir}/build/qt, cacheVariables: { CMAKE_PREFIX_PATH: C:/Qt/5.9.4/msvc2017_64 } }这样 configure 时不用带-DCMAKE_PREFIX_PATHCMake 会自动读 preset 里的配置。关于 version 字段6 对应 CMake 3.25 及以上3.29.3 完全支持。如果你是老版本 CMakeversion 降到 3 也能用但有些字段比如 architecture 的兼容性会差一点。写完之后运行cmake --list-presets会列出当前所有可用的 preset这一步能快速确认文件格式有没有写错。格式有问题的话CMake 会直接告诉你哪一行解析失败。从那以后我每到一个新环境第一件事不是敲 configure 命令而是先跑一遍cmake --version确认版本再列出已安装的生成器最后检查编译器在 PATH 里的位置。这三步走完才动手写构建文件。CMake 的坑大多数不在 CMake 本身而在环境不一致——这台机器是 VS 2022那台是 MinGW换机器就重新踩一遍。CMakePresets.json 能帮你把「这条路跑通过」的状态固化下来下次不管在哪台机器都能一键复现。希望帮到你。本文还有配套的精品资源点击获取
返回列表