CMake 是 Linux 开发环境中常用的跨平台构建工具,不少 C/C++ 项目会在构建阶段检查 CMake 版本。当项目要求 CMake 3.5.1 或更高版本,而 CentOS 自带版本过低时,执行 cmake 往往会出现版本不满足、配置失败等问题。
升级 CMake 时需要注意 CentOS 的发行版版本、系统软件仓库提供的版本以及是否需要保留原有 CMake。对于老版本 CentOS,更稳妥的方式通常是使用官方源码编译安装,并通过 PATH 或软链接控制默认版本。
一、先确认 CentOS 和当前 CMake 版本
升级之前建议先查看系统版本:
Bashcat /etc/centos-release
也可以查看更完整的信息:
Bashcat /etc/os-release
检查当前 CMake:
Bashcmake --version
典型输出可能类似:
cmake version 2.8.12.2 CMake suite maintained and supported by Kitware.
如果项目要求:
CMake 3.5.1 or higher
那么当前版本显然无法满足要求。
还可以确认当前 cmake 命令实际指向的位置:
Bashwhich cmake
或者:
Bashtype -a cmake
type -a 很有用,因为系统中可能同时存在多个 CMake,例如:
cmake is /usr/local/bin/cmake cmake is /usr/bin/cmake
这意味着升级后即使新版本已经安装,也可能因为 PATH 顺序不正确而继续执行旧版本。
二、为什么 CentOS 上需要单独升级 CMake
CentOS 某些版本的软件仓库比较稳定,但软件版本也相对保守。特别是较老的 CentOS 系统,默认仓库中的 CMake 版本可能远低于现代项目的最低要求。
例如一些项目的构建脚本中可能存在:
cmakecmake_minimum_required(VERSION 3.5.1)
当 CMake 版本低于要求时,就可能直接终止配置过程。
除了 cmake_minimum_required() 外,较新的项目还可能依赖较新版本 CMake 提供的模块、生成器和命令。因此,单纯修改项目配置文件中的最低版本并不能真正解决兼容性问题。
三、方法一:通过源码编译安装 CMake 3.5.1
对于需要明确安装 CMake 3.5.1 的场景,可以直接下载对应源码进行编译。
首先安装编译所需工具:
Bashyum groupinstall "Development Tools" -y
同时安装常用依赖:
Bashyum install openssl-devel -y
确认 Git、GCC 等工具正常:
Bashgcc --version g++ --version make --version
1. 下载 CMake 源码
如果需要 CMake 3.5.1,可以获取对应源码压缩包。假设源码文件已经放置在 /usr/local/src:
Bashcd /usr/local/src
解压:
Bashtar -zxvf cmake-3.5.1.tar.gz
进入源码目录:
Bashcd cmake-3.5.1
2. 执行配置
CMake 源码本身提供了 Bootstrap 构建方式,可以执行:
Bash./bootstrap
如果希望安装到独立目录,避免覆盖系统原有 CMake,可以指定安装路径:
Bash./bootstrap --prefix=/usr/local/cmake-3.5.1
执行过程中如果出现依赖缺失,根据错误信息安装对应的开发包即可。
3. 编译源码
Bootstrap 成功后执行:
Bashmake -j$(nproc)
$(nproc) 会根据当前服务器 CPU 核心数量设置并行编译任务,可以明显缩短编译时间。
如果服务器 CPU 核心较少,也可以使用:
Bashmake -j2
编译完成后建议确认是否生成了可执行文件:
Bash./bin/cmake --version
如果输出:
cmake version 3.5.1
说明源码编译成功。
4. 安装 CMake
执行:
Bashmake install
如果使用了:
Bash./bootstrap --prefix=/usr/local/cmake-3.5.1
那么安装后的 CMake 通常位于:
/usr/local/cmake-3.5.1/bin/cmake
可以直接验证:
Bash/usr/local/cmake-3.5.1/bin/cmake --version
四、配置 PATH,让系统默认使用新版本
源码安装完成后,最关键的一步是让 Shell 优先找到新版本。
临时测试可以执行:
Bashexport PATH=/usr/local/cmake-3.5.1/bin:$PATH
然后:
Bashcmake --version
如果结果变成:
cmake version 3.5.1
说明 PATH 配置正确。
如果希望每次登录都自动生效,可以将配置写入当前用户的:
Bash~/.bashrc
追加:
Bashexport PATH=/usr/local/cmake-3.5.1/bin:$PATH
然后重新加载:
Bashsource ~/.bashrc
再次执行:
Bashcmake --version
即可。
如果需要对所有用户生效,可以根据服务器实际管理策略配置 /etc/profile 或 /etc/profile.d/ 下的环境文件。
五、解决“已经安装新版本但 cmake 还是旧版本”
这是 CMake 升级过程中非常常见的问题。
假设新版本安装在:
/usr/local/cmake-3.5.1/bin/cmake
但执行:
Bashcmake --version
仍然得到:
cmake version 2.8.12.2
首先检查:
Bashwhich cmake
如果显示:
/usr/bin/cmake
说明当前 PATH 中 /usr/bin 的优先级高于新 CMake 所在目录。
检查 PATH:
Bashecho $PATH
确保:
/usr/local/cmake-3.5.1/bin
出现在 /usr/bin 前面。
修改后执行:
Bashsource ~/.bashrc
如果 Shell 仍然缓存旧路径,可以执行:
Bashhash -r
然后再次检查:
Bashwhich cmake cmake --version
六、方法二:使用软链接切换 CMake 版本
如果服务器上需要长期维护多个 CMake 版本,可以使用软链接管理。
例如新版本位于:
/usr/local/cmake-3.5.1/bin/cmake
可以创建:
Bashln -sf /usr/local/cmake-3.5.1/bin/cmake /usr/local/bin/cmake
然后确认:
Bash/usr/local/bin/cmake --version
如果 /usr/local/bin 位于 /usr/bin 前面,那么直接执行:
Bashcmake --version
也会使用新版本。
不过,直接修改 /usr/bin/cmake 并不推荐。系统软件包可能依赖原有文件,强行覆盖容易给系统维护带来隐患。将新版本安装到 /usr/local,再通过 PATH 或独立软链接进行管理更加安全。
七、方法三:通过系统仓库安装较新版本
部分 CentOS 环境可以借助额外的软件仓库获得比默认仓库更新的 CMake。
可以先查询仓库中的可用版本:
Bashyum list cmake
或者:
Bashyum info cmake
如果仓库版本已经满足项目要求,可以直接安装或升级:
Bashyum install cmake -y
如果系统中已经存在旧版本,也可以根据实际仓库情况执行:
Bashyum update cmake -y
安装后检查:
Bashcmake --version
这种方式最大的优点是软件包由系统包管理器维护,卸载和升级比较方便。
但需要注意,CentOS 不同版本对应的软件仓库内容不同。如果默认仓库无法提供 CMake 3.5.1 以上版本,就不应该为了升级 CMake 而随意替换系统软件源。对于生产环境,源码安装到独立目录往往更容易控制影响范围。
八、升级 CMake 后检查编译器环境
CMake 本身只是构建系统生成工具,升级成功并不代表 C/C++ 项目一定能够正常编译。
建议同时检查:
Bashgcc --version g++ --version make --version
如果项目使用 Ninja,也可以检查:
Bashninja --version
然后进入项目目录执行:
Bashcmake -S . -B build
对于较老的 CMake 版本,如果项目不支持 -S、-B 等较新的命令行参数,也可以使用传统方式:
Bashmkdir build cd build cmake ..
配置成功后再执行:
Bashmake -j$(nproc)
这样能够验证 CMake、编译器、链接器和项目依赖是否整体正常。
九、避免旧 CMake 缓存造成误判
CMake 会将大量配置结果保存到构建目录中,其中最重要的文件之一是:
CMakeCache.txt
如果之前使用旧版本 CMake 配置过项目,升级 CMake 后直接重新执行:
Bashcmake ..
有时会继续受到旧缓存影响。
比较稳妥的做法是删除旧的构建目录:
Bashrm -rf build mkdir build cd build cmake ..
如果项目比较重要,不建议直接删除唯一的构建目录,可以先备份:
Bashmv build build_old mkdir build cd build cmake ..
这样既能使用全新的 CMake 配置,又可以保留原有构建结果供后续排查。
十、CMake 版本升级后的验证清单
升级完成后,可以按照下面的顺序检查:
Bashwhich cmake
确认执行路径。
Bashcmake --version
确认实际版本。
Bashecho $PATH
确认 PATH 优先级。
然后测试 CMake 是否能够正常生成构建文件:
Bashmkdir -p /tmp/cmake-test cd /tmp/cmake-test cmake --version
如果需要验证完整编译流程,可以准备一个简单的 C++ 项目:
cmake-test/ ├── CMakeLists.txt └── main.cpp
CMakeLists.txt:
cmakecmake_minimum_required(VERSION 3.5.1) project(cmake_test) add_executable(cmake_test main.cpp)
main.cpp:
C++#includeint main() { std::cout << "CMake test successful" << std::endl; return 0; }
执行:
Bashmkdir build cd build cmake .. make
最后运行:
Bash./cmake_test
如果输出:
CMake test successful
说明从 CMake 配置到编译、链接和运行的基本流程均正常。
十一、常见问题及解决方法
1. cmake: command not found
说明系统 PATH 中没有找到 CMake。
可以先搜索安装位置:
Bashfind /usr/local -name cmake -type f 2>/dev/null
如果找到:
/usr/local/cmake-3.5.1/bin/cmake
则执行:
Bashexport PATH=/usr/local/cmake-3.5.1/bin:$PATH
再检查:
Bashcmake --version
2. CMake 3.5.1 or higher is required
这是典型的版本过低问题。
先确认:
Bashcmake --version
然后安装符合项目要求的版本。不要只修改:
cmakecmake_minimum_required(VERSION ...)
来绕过检查,因为项目可能确实使用了新版本 CMake 的功能。
3. Bootstrap 阶段出现编译错误
可以重点检查 GCC、G++、Make 以及 OpenSSL 开发依赖:
Bashgcc --version g++ --version make --version rpm -qa | grep openssl-devel
如果缺少开发工具,可以重新安装:
Bashyum groupinstall "Development Tools" -y yum install openssl-devel -y
4. 新版本安装成功,但命令仍显示旧版本
重点检查:
Bashtype -a cmake
以及:
Bashwhich cmake
通常是多个 CMake 并存导致 PATH 优先级不正确。
可以执行:
Bashhash -r
再重新确认版本。
5. 不建议直接删除系统 CMake
如果系统中的 CMake 是通过 RPM 安装的,不建议直接:
Bashrm /usr/bin/cmake
然后替换新文件。
更合理的方案是将新 CMake 安装到:
/usr/local/cmake-3.5.1
通过 PATH 控制使用版本。这样即使新版本出现问题,也可以快速恢复原有环境。
十二、3.5.1 与更高版本应该如何选择
如果项目只是明确要求:
CMake >= 3.5.1
理论上安装 3.5.1 就可以满足最低版本条件。
不过,如果项目本身没有限制最高版本,通常不建议为了满足最低要求而长期停留在非常老的 CMake 版本。实际选择时应结合项目的 CMakeLists.txt、依赖库、编译器版本以及目标操作系统综合判断。
对于老旧 CentOS 环境尤其如此:CMake 版本较新并不意味着系统中的 GCC、GLIBC、OpenSSL 或第三方依赖也足够新。如果升级过程中出现与系统库相关的问题,应先确认项目到底需要哪一层软件版本,而不是单独不断提高 CMake 版本。
十三、推荐的稳定升级方案
对于 CentOS 服务器,如果目标只是解决“CMake 版本低于 3.5.1”的问题,可以采用下面的思路:
Bash# 1. 查看当前版本 cmake --version # 2. 查看当前路径 which cmake # 3. 准备源码 cd /usr/local/src tar -zxvf cmake-3.5.1.tar.gz cd cmake-3.5.1 # 4. 配置安装目录 ./bootstrap --prefix=/usr/local/cmake-3.5.1 # 5. 编译 make -j$(nproc) # 6. 安装 make install # 7. 临时切换版本 export PATH=/usr/local/cmake-3.5.1/bin:$PATH # 8. 验证 cmake --version which cmake
确认运行正常后,再将 PATH 配置持久化。
这种方式不会覆盖系统原有 CMake,同时方便后续升级到其他版本。例如以后需要 CMake 3.10、3.20 或更高版本,可以分别安装到不同目录:
/usr/local/cmake-3.5.1 /usr/local/cmake-3.10.x /usr/local/cmake-3.20.x
通过调整 PATH 即可切换版本。
对于需要在多套构建环境之间切换的服务器,这种独立目录管理方式尤其方便。