CentOS系统下升级CMake至3.5.1及以上版本指南

7 次阅读

CMake 是 Linux 开发环境中常用的跨平台构建工具,不少 C/C++ 项目会在构建阶段检查 CMake 版本。当项目要求 CMake 3.5.1 或更高版本,而 CentOS 自带版本过低时,执行 cmake 往往会出现版本不满足、配置失败等问题。

升级 CMake 时需要注意 CentOS 的发行版版本、系统软件仓库提供的版本以及是否需要保留原有 CMake。对于老版本 CentOS,更稳妥的方式通常是使用官方源码编译安装,并通过 PATH 或软链接控制默认版本。

一、先确认 CentOS 和当前 CMake 版本

升级之前建议先查看系统版本:

Bash
cat /etc/centos-release

也可以查看更完整的信息:

Bash
cat /etc/os-release

检查当前 CMake:

Bash
cmake --version

典型输出可能类似:

cmake version 2.8.12.2

CMake suite maintained and supported by Kitware.

如果项目要求:

CMake 3.5.1 or higher

那么当前版本显然无法满足要求。

还可以确认当前 cmake 命令实际指向的位置:

Bash
which cmake

或者:

Bash
type -a cmake

type -a 很有用,因为系统中可能同时存在多个 CMake,例如:

cmake is /usr/local/bin/cmake
cmake is /usr/bin/cmake

这意味着升级后即使新版本已经安装,也可能因为 PATH 顺序不正确而继续执行旧版本。

二、为什么 CentOS 上需要单独升级 CMake

CentOS 某些版本的软件仓库比较稳定,但软件版本也相对保守。特别是较老的 CentOS 系统,默认仓库中的 CMake 版本可能远低于现代项目的最低要求。

例如一些项目的构建脚本中可能存在:

cmake
cmake_minimum_required(VERSION 3.5.1)

当 CMake 版本低于要求时,就可能直接终止配置过程。

除了 cmake_minimum_required() 外,较新的项目还可能依赖较新版本 CMake 提供的模块、生成器和命令。因此,单纯修改项目配置文件中的最低版本并不能真正解决兼容性问题。

三、方法一:通过源码编译安装 CMake 3.5.1

对于需要明确安装 CMake 3.5.1 的场景,可以直接下载对应源码进行编译。

首先安装编译所需工具:

Bash
yum groupinstall "Development Tools" -y

同时安装常用依赖:

Bash
yum install openssl-devel -y

确认 Git、GCC 等工具正常:

Bash
gcc --version
g++ --version
make --version

1. 下载 CMake 源码

如果需要 CMake 3.5.1,可以获取对应源码压缩包。假设源码文件已经放置在 /usr/local/src:

Bash
cd /usr/local/src

解压:

Bash
tar -zxvf cmake-3.5.1.tar.gz

进入源码目录:

Bash
cd cmake-3.5.1

2. 执行配置

CMake 源码本身提供了 Bootstrap 构建方式,可以执行:

Bash
./bootstrap

如果希望安装到独立目录,避免覆盖系统原有 CMake,可以指定安装路径:

Bash
./bootstrap --prefix=/usr/local/cmake-3.5.1

执行过程中如果出现依赖缺失,根据错误信息安装对应的开发包即可。

3. 编译源码

Bootstrap 成功后执行:

Bash
make -j$(nproc)

$(nproc) 会根据当前服务器 CPU 核心数量设置并行编译任务,可以明显缩短编译时间。

如果服务器 CPU 核心较少,也可以使用:

Bash
make -j2

编译完成后建议确认是否生成了可执行文件:

Bash
./bin/cmake --version

如果输出:

cmake version 3.5.1

说明源码编译成功。

4. 安装 CMake

执行:

Bash
make 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 优先找到新版本。

临时测试可以执行:

Bash
export PATH=/usr/local/cmake-3.5.1/bin:$PATH

然后:

Bash
cmake --version

如果结果变成:

cmake version 3.5.1

说明 PATH 配置正确。

如果希望每次登录都自动生效,可以将配置写入当前用户的:

Bash
~/.bashrc

追加:

Bash
export PATH=/usr/local/cmake-3.5.1/bin:$PATH

然后重新加载:

Bash
source ~/.bashrc

再次执行:

Bash
cmake --version

即可。

如果需要对所有用户生效,可以根据服务器实际管理策略配置 /etc/profile 或 /etc/profile.d/ 下的环境文件。

五、解决“已经安装新版本但 cmake 还是旧版本”

这是 CMake 升级过程中非常常见的问题。

假设新版本安装在:

/usr/local/cmake-3.5.1/bin/cmake

但执行:

Bash
cmake --version

仍然得到:

cmake version 2.8.12.2

首先检查:

Bash
which cmake

如果显示:

/usr/bin/cmake

说明当前 PATH 中 /usr/bin 的优先级高于新 CMake 所在目录。

检查 PATH:

Bash
echo $PATH

确保:

/usr/local/cmake-3.5.1/bin

出现在 /usr/bin 前面。

修改后执行:

Bash
source ~/.bashrc

如果 Shell 仍然缓存旧路径,可以执行:

Bash
hash -r

然后再次检查:

Bash
which cmake
cmake --version

六、方法二:使用软链接切换 CMake 版本

如果服务器上需要长期维护多个 CMake 版本,可以使用软链接管理。

例如新版本位于:

/usr/local/cmake-3.5.1/bin/cmake

可以创建:

Bash
ln -sf /usr/local/cmake-3.5.1/bin/cmake /usr/local/bin/cmake

然后确认:

Bash
/usr/local/bin/cmake --version

如果 /usr/local/bin 位于 /usr/bin 前面,那么直接执行:

Bash
cmake --version

也会使用新版本。

不过,直接修改 /usr/bin/cmake 并不推荐。系统软件包可能依赖原有文件,强行覆盖容易给系统维护带来隐患。将新版本安装到 /usr/local,再通过 PATH 或独立软链接进行管理更加安全。

七、方法三:通过系统仓库安装较新版本

部分 CentOS 环境可以借助额外的软件仓库获得比默认仓库更新的 CMake。

可以先查询仓库中的可用版本:

Bash
yum list cmake

或者:

Bash
yum info cmake

如果仓库版本已经满足项目要求,可以直接安装或升级:

Bash
yum install cmake -y

如果系统中已经存在旧版本,也可以根据实际仓库情况执行:

Bash
yum update cmake -y

安装后检查:

Bash
cmake --version

这种方式最大的优点是软件包由系统包管理器维护,卸载和升级比较方便。

但需要注意,CentOS 不同版本对应的软件仓库内容不同。如果默认仓库无法提供 CMake 3.5.1 以上版本,就不应该为了升级 CMake 而随意替换系统软件源。对于生产环境,源码安装到独立目录往往更容易控制影响范围。

八、升级 CMake 后检查编译器环境

CMake 本身只是构建系统生成工具,升级成功并不代表 C/C++ 项目一定能够正常编译。

建议同时检查:

Bash
gcc --version
g++ --version
make --version

如果项目使用 Ninja,也可以检查:

Bash
ninja --version

然后进入项目目录执行:

Bash
cmake -S . -B build

对于较老的 CMake 版本,如果项目不支持 -S、-B 等较新的命令行参数,也可以使用传统方式:

Bash
mkdir build
cd build
cmake ..

配置成功后再执行:

Bash
make -j$(nproc)

这样能够验证 CMake、编译器、链接器和项目依赖是否整体正常。

九、避免旧 CMake 缓存造成误判

CMake 会将大量配置结果保存到构建目录中,其中最重要的文件之一是:

CMakeCache.txt

如果之前使用旧版本 CMake 配置过项目,升级 CMake 后直接重新执行:

Bash
cmake ..

有时会继续受到旧缓存影响。

比较稳妥的做法是删除旧的构建目录:

Bash
rm -rf build
mkdir build
cd build
cmake ..

如果项目比较重要,不建议直接删除唯一的构建目录,可以先备份:

Bash
mv build build_old
mkdir build
cd build
cmake ..

这样既能使用全新的 CMake 配置,又可以保留原有构建结果供后续排查。

十、CMake 版本升级后的验证清单

升级完成后,可以按照下面的顺序检查:

Bash
which cmake

确认执行路径。

Bash
cmake --version

确认实际版本。

Bash
echo $PATH

确认 PATH 优先级。

然后测试 CMake 是否能够正常生成构建文件:

Bash
mkdir -p /tmp/cmake-test
cd /tmp/cmake-test
cmake --version

如果需要验证完整编译流程,可以准备一个简单的 C++ 项目:

cmake-test/
├── CMakeLists.txt
└── main.cpp

CMakeLists.txt:

cmake
cmake_minimum_required(VERSION 3.5.1)

project(cmake_test)

add_executable(cmake_test main.cpp)

main.cpp:

C++
#include 

int main()
{
    std::cout << "CMake test successful" << std::endl;
    return 0;
}

执行:

Bash
mkdir build
cd build
cmake ..
make

最后运行:

Bash
./cmake_test

如果输出:

CMake test successful

说明从 CMake 配置到编译、链接和运行的基本流程均正常。

十一、常见问题及解决方法

1. cmake: command not found

说明系统 PATH 中没有找到 CMake。

可以先搜索安装位置:

Bash
find /usr/local -name cmake -type f 2>/dev/null

如果找到:

/usr/local/cmake-3.5.1/bin/cmake

则执行:

Bash
export PATH=/usr/local/cmake-3.5.1/bin:$PATH

再检查:

Bash
cmake --version

2. CMake 3.5.1 or higher is required

这是典型的版本过低问题。

先确认:

Bash
cmake --version

然后安装符合项目要求的版本。不要只修改:

cmake
cmake_minimum_required(VERSION ...)

来绕过检查,因为项目可能确实使用了新版本 CMake 的功能。

3. Bootstrap 阶段出现编译错误

可以重点检查 GCC、G++、Make 以及 OpenSSL 开发依赖:

Bash
gcc --version
g++ --version
make --version
rpm -qa | grep openssl-devel

如果缺少开发工具,可以重新安装:

Bash
yum groupinstall "Development Tools" -y
yum install openssl-devel -y

4. 新版本安装成功,但命令仍显示旧版本

重点检查:

Bash
type -a cmake

以及:

Bash
which cmake

通常是多个 CMake 并存导致 PATH 优先级不正确。

可以执行:

Bash
hash -r

再重新确认版本。

5. 不建议直接删除系统 CMake

如果系统中的 CMake 是通过 RPM 安装的,不建议直接:

Bash
rm /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 即可切换版本。

对于需要在多套构建环境之间切换的服务器,这种独立目录管理方式尤其方便。