简介:cmake-3.24.0.tar.gz 是 CMake 3.24.0 官方源码发行包,面向使用 C++ 进行跨平台开发的工程师、学生及构建系统维护者,用于在 Linux、macOS 等环境下自行编译安装 CMake,解决多编译器、多平台下构建流程不统一的问题。压缩包约 9.91MB,内含约 2000 个文件,以 cmake 脚本、txt 说明、rst 文档、c、h、cxx、cpp 等源码与头文件为主,并包含 json、py、sh、bat 等辅助脚本及少量测试用例与资源文件,完整覆盖 CMake 自身的构建逻辑、模块定义与文档体系。已有 426 人学习下载。通过该源码包,读者可深入理解 CMakeLists.txt 的解析机制、FindPackage 依赖查找、CTest 测试集成与 CPack 打包流程,并借助 bootstrap 配置与 Makefile 生成过程,掌握从源码编译构建工具链的完整思路,适合需要定制构建环境或研究 CMake 内部实现的中高级开发者参考。
1. 从源码装 CMake 3.24.0:为什么我不建议你直接用系统包管理器
系统自带的 CMake 版本,大概率会让你在编译某个 C++ 项目时突然卡住。你可能遇到过这种场景:clone 下来一个开源库,README 里写着cmake_minimum_required(VERSION 3.24),而你敲下cmake --version一看,系统里躺着的是 3.16 甚至 3.10。这不是玄学,是很多 Linux 发行版为了稳定性,长期锁定旧版本 CMake 导致的。C++ 生态里,CMake 3.24 是一个分水岭版本,它对FetchContent的改进、对SYSTEM属性的支持、以及对新标准C++23的编译特性探测,都是后续很多现代 C++ 项目能顺利构建的前提。如果你正在编译 LLVM、某些深度学习推理框架,或者公司内部那个依赖链极深的 C++ 工程,系统包管理器给的版本基本不够用。这篇笔记记录的是我如何在几台干净的 Linux 机器上,从cmake-3.24.0.tar.gz源码包开始,一步步装出一个不污染系统、可随时回退的 CMake 环境。适合那些不想升级整机系统、又必须用上新版 CMake 的开发者。
2. 装前准备:确认依赖与清理旧版本
2.1 检查系统现有 CMake 与编译器
在动手解压之前,先摸清底细。我一般会先跑三条命令,确认当前环境里 CMake 的来路、版本,以及 C++ 编译器是否就绪。
# 查看当前 cmake 路径和版本 which cmake cmake --version # 查看 g++ 或 clang++ 版本,CMake 3.24 需要 C++11 以上编译器 g++ --version clang++ --version逻辑说明:which cmake能告诉你当前用的是/usr/bin/cmake还是某个自定义路径下的版本。如果输出是/usr/bin/cmake,那基本就是系统包管理器装的。cmake --version看具体版本号,低于 3.24 就得考虑源码安装。编译器版本方面,CMake 3.24 本身构建需要 C++11 支持,但为了后续能编译现代 C++ 项目,建议 g++ 至少 9 以上,clang++ 至少 10 以上。如果编译器太老,源码编译 CMake 时会在 bootstrap 阶段报错。
参数说明:这里没有复杂参数,重点是确认g++或clang++至少有一个可用。如果两个都没有,需要先装编译器,常见做法是sudo apt install build-essential或sudo yum groupinstall "Development Tools"。
2.2 安装编译 CMake 所需的依赖库
CMake 源码编译依赖 OpenSSL 开发库,用于支持cmake --build时的网络下载和签名验证。如果缺少这个库,bootstrap 阶段会提示找不到openssl头文件。
# Debian/Ubuntu 系 sudo apt update sudo apt install -y libssl-dev libncurses-dev # RHEL/CentOS 系 sudo yum install -y openssl-devel ncurses-devel逻辑说明:libssl-dev提供 OpenSSL 头文件和静态库,CMake 在编译cmake可执行文件时需要链接它。libncurses-dev则是为了ccmake和cmake-gui的终端界面支持,虽然不装也能编译出命令行版,但后续如果想用ccmake调参数,缺了它就得重来。我一般会一次性装上,省得后面补。
参数说明:-y表示自动确认,适合脚本化操作。如果你在容器里构建,记得把这两条命令写进 Dockerfile 的RUN层。
2.3 彻底清理旧版本 CMake 的残留
如果系统里已经有旧版 CMake,直接源码安装到/usr/local会导致PATH里新旧版本打架。我踩过的坑是:cmake --version显示 3.24,但某个 IDE 或构建脚本里硬编码了/usr/bin/cmake,结果还是调用了旧版。
# 查看所有 cmake 相关可执行文件 ls -l /usr/bin/cmake* /usr/local/bin/cmake* 2>/dev/null # 如果确认旧版是包管理器装的,可以卸载(谨慎操作) sudo apt remove --purge cmake cmake-data sudo apt autoremove逻辑说明:ls -l列出所有可能的 cmake 路径,避免遗漏。apt remove --purge会删除包管理器安装的 CMake 及其配置文件。注意,这一步不是必须的,如果你不想动系统包,可以跳过,但后续必须确保PATH中/usr/local/bin优先于/usr/bin。
参数说明:--purge表示连配置文件一起删,autoremove清理不再需要的依赖。如果系统里其他工具依赖旧版 CMake,卸载前先确认一下,避免误伤。
3. 源码编译安装:从 tar.gz 到可执行文件
3.1 解压与目录结构说明
拿到cmake-3.24.0.tar.gz后,先解压到一个工作目录。我习惯放在~/build下,避免污染源码树。
mkdir -p ~/build && cd ~/build tar -xzvf /path/to/cmake-3.24.0.tar.gz cd cmake-3.24.0逻辑说明:tar -xzvf解压 gzip 压缩的 tar 包,-x解压,-z处理 gzip,-v显示过程,-f指定文件名。解压后进入cmake-3.24.0目录,里面会有Bootstrap、CMakeLists.txt、Source、Modules等。Bootstrap是源码编译的入口脚本,不是标准的configure,这点和很多 GNU 项目不一样。
参数说明:/path/to/替换成你实际存放 tar.gz 的路径。如果下载的包在 Windows 上,传到 Linux 后注意换行符问题,Bootstrap脚本可能因为 CRLF 报错,可以用dos2unix处理。
3.2 执行 Bootstrap 脚本:关键参数怎么选
Bootstrap脚本决定了 CMake 装在哪、启用哪些特性。我一般会显式指定安装前缀,避免默认装到/usr/local后和系统包冲突。
./Bootstrap --prefix=/opt/cmake-3.24.0 \ --parallel=$(nproc) \ -- -DCMAKE_USE_OPENSSL=ON \ -DCMAKE_BUILD_TYPE=Release逻辑说明:--prefix指定安装根目录,我选/opt/cmake-3.24.0,这样不同版本可以共存,切换时只改PATH或软链接。--parallel=$(nproc)让 bootstrap 阶段并行编译,nproc返回 CPU 核心数,能显著加快速度。--后面的参数直接传给底层 CMake 构建系统,-DCMAKE_USE_OPENSSL=ON确保启用 OpenSSL 支持,-DCMAKE_BUILD_TYPE=Release生成优化后的二进制。
参数说明:--parallel后面的数字建议不超过物理核心数,否则可能内存不足。如果机器内存小于 4GB,建议去掉--parallel或设为 2。--prefix路径不要带空格,否则后续PATH配置会出问题。
3.3 编译与安装:make 阶段的注意事项
Bootstrap 成功后,会生成Makefile,接下来就是标准的make和make install。
make -j$(nproc) sudo make install逻辑说明:make -j$(nproc)并行编译,充分利用多核。sudo make install把编译好的文件复制到--prefix指定的目录。如果/opt目录当前用户没有写权限,就需要sudo。安装完成后,/opt/cmake-3.24.0/bin/cmake就是新版可执行文件。
参数说明:-j后面的数字同样建议匹配核心数。如果编译过程中报错,先看错误信息里缺失的头文件或库,通常是依赖没装全。make install不要加-j,安装步骤本身是串行的,加了反而可能出错。
3.4 配置环境变量:让新版本优先被找到
装完后,直接敲cmake可能还是旧版。需要把/opt/cmake-3.24.0/bin加到PATH最前面。
# 临时生效 export PATH=/opt/cmake-3.24.0/bin:$PATH # 永久生效,写入 ~/.bashrc echo 'export PATH=/opt/cmake-3.24.0/bin:$PATH' >> ~/.bashrc source ~/.bashrc逻辑说明:export PATH把新路径插到最前面,确保 shell 查找cmake时先命中新版。写入~/.bashrc后,每次新开终端都会自动加载。如果用的是 zsh,改~/.zshrc。
参数说明:$PATH保留原有路径,冒号分隔。不要直接覆盖PATH,否则系统命令都找不到了。如果多人共用机器,可以写到/etc/profile.d/cmake.sh里,但需要sudo。
4. 避坑与排查:源码装 CMake 常见的五个翻车点
4.1 现象:Bootstrap 报错 “Could not find OpenSSL”
原因:系统缺少 OpenSSL 开发库,或者头文件路径不在默认搜索范围内。常见于最小化安装的 Linux 发行版。
解决:先确认libssl-dev或openssl-devel已安装。如果已安装仍报错,手动指定 OpenSSL 路径:./Bootstrap -- -DOPENSSL_ROOT_DIR=/usr/lib/x86_64-linux-gnu。路径根据实际系统调整,可以用dpkg -L libssl-dev | grep libssl.so查找。
4.2 现象:make 阶段内存不足被 OOM Killer 终止
原因:make -j$(nproc)并行度过高,每个编译单元消耗几百 MB 内存,小内存机器扛不住。
解决:降低并行度,比如make -j2,或者分步编译:先make -j2再make。如果机器有 swap,确保 swap 已启用。我一般会在 2GB 内存的 VPS 上直接用-j1,慢但稳。
4.3 现象:安装后cmake --version仍显示旧版本
原因:PATH顺序不对,或者 shell 缓存了旧命令路径。hash -r可以清除缓存。
解决:先which cmake确认实际路径。如果是/usr/bin/cmake,说明PATH没生效。检查~/.bashrc里export PATH是否在旧路径之前。执行hash -r后重新敲cmake --version。如果还不行,直接绝对路径调用/opt/cmake-3.24.0/bin/cmake测试。
4.4 现象:编译某个 C++ 项目时提示 “CMake 3.24 or higher is required”
原因:项目CMakeLists.txt里写了cmake_minimum_required(VERSION 3.24),但当前调用的 CMake 还是旧版。
解决:确认cmake --version输出 3.24.0。如果已经是 3.24 但仍报错,检查 IDE 或构建脚本里是否硬编码了/usr/bin/cmake。常见做法是在项目根目录下建一个CMakePresets.json,指定cmakeExecutable为新版路径。
4.5 现象:ccmake或cmake-gui无法启动,提示缺少 ncurses
原因:Bootstrap 时没有启用 ncurses 支持,或者系统缺少libncurses-dev。
解决:安装libncurses-dev后重新 Bootstrap,加上-- -DCMAKE_USE_NCURSES=ON。如果只需要命令行版,可以忽略这个问题,cmake本身不受影响。
5. 验证安装:跑通一个最小 C++ 项目
装完不验证,等于没装。我习惯用一个最小 C++ 项目来确认 CMake 3.24.0 能正常工作,顺便检查它对新特性的支持。
5.1 创建测试项目与 CMakeLists.txt
mkdir -p ~/test-cmake && cd ~/test-cmake cat > main.cpp << 'EOF' #include <iostream> int main() { std::cout << "CMake 3.24.0 works!" << std::endl; return 0; } EOF cat > CMakeLists.txt << 'EOF' cmake_minimum_required(VERSION 3.24) project(TestCMake LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(test_cmake main.cpp) EOF逻辑说明:cmake_minimum_required(VERSION 3.24)强制要求 3.24,如果调用了旧版会直接报错,这是最直接的验证。project声明项目名和语言。CMAKE_CXX_STANDARD 17启用 C++17,CMAKE_CXX_STANDARD_REQUIRED ON确保编译器不支持时报错而不是降级。add_executable生成可执行文件。
参数说明:LANGUAGES CXX只启用 C++,避免检测 C 编译器。如果项目需要 C,改成LANGUAGES C CXX。
5.2 构建与运行验证
mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release cmake --build . --parallel $(nproc) ./test_cmake逻辑说明:mkdir build && cd build是标准的 out-of-source 构建,保持源码树干净。cmake ..读取上级目录的CMakeLists.txt,-DCMAKE_BUILD_TYPE=Release生成优化构建。cmake --build .是 CMake 3.24 推荐的构建方式,比直接make更通用。--parallel $(nproc)并行编译。最后运行./test_cmake,如果输出CMake 3.24.0 works!,说明安装成功。
参数说明:-DCMAKE_BUILD_TYPE=Release可以换成Debug或RelWithDebInfo。--parallel后面的数字同样建议匹配核心数。如果cmake ..报错提示版本不够,说明PATH里的cmake还是旧版,回到 4.3 排查。
5.3 验证 CMake 3.24 特有功能:FetchContent 的 SYSTEM 属性
CMake 3.24 对FetchContent增加了SYSTEM属性支持,可以抑制第三方库的警告。我一般会顺手验证这个特性,确保装的是真 3.24 而不是改过版本号的旧版。
cat > CMakeLists.txt << 'EOF' cmake_minimum_required(VERSION 3.24) project(FetchTest LANGUAGES CXX) include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1 SYSTEM ) FetchContent_MakeAvailable(googletest) message(STATUS "FetchContent SYSTEM property is supported") EOF逻辑说明:FetchContent_Declare里的SYSTEM关键字是 3.24 新增的,旧版会报未知参数。FetchContent_MakeAvailable拉取并构建依赖。message(STATUS ...)输出提示信息。如果配置阶段没有报错,说明 3.24 的 FetchContent 特性可用。
参数说明:GIT_REPOSITORY和GIT_TAG指定依赖来源和版本。如果网络受限,可以换成URL方式。SYSTEM属性让 CMake 把该依赖的头文件视为系统头文件,抑制警告。
从那以后我每次装完 CMake,都会强制走一遍这个最小项目验证,确认版本、编译器、构建类型和 FetchContent 都正常。希望帮到你。
本文还有配套的精品资源,点击获取