找回密码
 立即注册
首页 业界区 安全 CMake构建学习笔记32-CMake版本切换

CMake构建学习笔记32-CMake版本切换

蔺堰 2026-1-13 21:10:00
1. 引言

在使用 CMake 构建 C/C++ 程序的时候,会遇到 CMake 版本兼容性问题。比如笔者构建 gflags 的时候提示:
  1. Running: cmake "../Source/gflags-2.2.2" -B"./gflags-2.2.2" -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_PREFIX_PATH="/home/ubuntu/GISBasic/" -DCMAKE_INSTALL_PREFIX="/home/ubuntu/GISBasic/" -DBUILD_SHARED_LIBS=ONCMake Error at CMakeLists.txt:73 (cmake_minimum_required):  Compatibility with CMake < 3.5 has been removed from CMake.  Update the VERSION argument  value.  Or, use the ... syntax  to tell CMake that the project requires at least  but has been updated  to work with policies introduced by  or earlier.  Or, add -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to try configuring anyway.-- Configuring incomplete, errors occurred!Error: could not find CMAKE_PROJECT_NAME in CacheError: could not find CMAKE_PROJECT_NAME in Cache/home/ubuntu/projects/charlee-blogubuntu@VM-0-7-ubuntu:~/projects/charlee-blog$ cmake --versioncmake version 4.1.2
复制代码
原因是因为笔者使用的是 CMake 4.1.2,CMake 不再支持 cmake_minimum_required(VERSION x.y) 中指定低于 3.5 的版本。而构建 gflags 的要求却是 cmake_minimum_required(VERSION 2.8.12),因此报错。因此一个比较好的解决方案就是安装多个 CMake 版本并在它们之间临时切换。
2. 解决

2.1 重新构建

首先讨论一个问题:切换 CMake 版本后,由于 CMake 的版本不一致,会不会导致已经构建好的程序需要重新构建?答案是不需要。因为 CMake 是“构建系统生成器”,它的作用是读取 CMakeLists.txt,生成 Makefile / Ninja / Visual Studio 等 本地构建文件。而实际的程序编译工作是由 make、ninja、gcc、clang 等完成的。
2.2 安装版本

在 Ubuntu 环境下,一般可以通过系统包管理器(apt)或者 Kitware 官方源安装 CMake,例如笔者的情况是:
  1. ubuntu@VM-0-7-ubuntu:~/projects/charlee-blog$ cmake --versioncmake version 4.1.2CMake suite maintained and supported by Kitware (kitware.com/cmake).ubuntu@VM-0-7-ubuntu:~/projects/charlee-blog$ which cmake/usr/bin/cmake
复制代码
如果当前版本的 CMake 不能正确构建 C/C++ 程序,就需要安装一个新的 CMake 版本。可以在官方 CMake 二进制包下载地址( https://github.com/Kitware/CMake/releases )找到以 .tar.gz 结尾的 Linux x86_64 目标版本即可,解压即用,无需安装。例如:
  1. ubuntu@VM-0-7-ubuntu:~/tools/cmake/cmake-3.26.4-linux-x86_64/bin$ dirccmake  cmake  cmake-gui  cpack  ctestubuntu@VM-0-7-ubuntu:~/tools/cmake/cmake-3.26.4-linux-x86_64/bin$ which cmake/usr/bin/cmake
复制代码
2.3 切换配置

update-alternatives 是 Linux 系统(特别是基于 Debian/Ubuntu 的发行版)中用于管理多个版本的同名命令或程序的一个工具。它的主要作用是在系统中存在多个可执行文件提供相同功能时,方便地切换默认使用的版本。
update-alternatives 的原理很简单,就是通过创建符号链接的方式,在 /usr/bin/(或其他目录)下维护一个“通用名称”(如 gcc、cmake),并将其指向实际安装的某个具体版本(如 /usr/bin/gcc-11 或 /usr/bin/gcc-13)。这些映射关系由 update-alternatives 统一管理,存储在 /var/lib/dpkg/alternatives/ 中。
具体操作如下:

  • 执行如下命令:
    1. sudo update-alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake 100sudo update-alternatives --install /usr/local/bin/cmake cmake /home/ubuntu/tools/cmake/cmake-3.26.4-linux-x86_64/bin/cmake 90
    复制代码
  • 确保 /usr/local/bin 在 环境变量 PATH 中(通常默认情况就在):
    1. echo $PATH
    复制代码
  • 切换 CMake 版本:
    1. sudo update-alternatives --config cmake
    复制代码
    可以看到类似输出:
    1. There are 2 choices for the alternative cmake (providing /usr/local/bin/cmake).Selection    Path                                                                 Priority   Status------------------------------------------------------------* 0            /usr/bin/cmake                                                       100       auto mode1            /usr/bin/cmake                                                       100       manual mode2            /home/ubuntu/tools/cmake/cmake-3.26.4-linux-x86_64/bin/cmake         90        manual modePress  to keep the current choice
    2. [*], or type selection number:
    复制代码
    输入 2 回车表示切换到 CMake 3.26.4,输入 1 回车表示切换回 CMake 4.1.2。
  • 进行验证:
    1. cmake --versionwhich cmake
    复制代码
    切换后,which cmake 应该显示:
    1. /usr/local/bin/cmake
    复制代码
    而 /usr/local/bin/cmake 是一个符号链接,指向选中的实际版本。
2.4 注意

笔者在验证的时候始终切换不成功:
  1. ubuntu@VM-0-7-ubuntu:~$ cmake --versionCMake Error: Could not find CMAKE_ROOT !!!CMake has most likely not been installed correctly.Modules directory not found in/home/ubuntu/tools/cmake/cmake-3.26.4-linux-x86_64/share/cmake-4.1cmake version 4.1.2
复制代码
原因是因为 Shell 命令哈希(hash)缓存,之前运行过 cmake 命令时,/usr/local/bin/cmake 还没生效或不在 PATH 前面,所以 bash 记住了“cmake = /usr/bin/cmake”:
  1. $ type cmakecmake is hashed (/usr/bin/cmake)
复制代码
因此即使你现在配置好了 /usr/local/bin/cmake 并且使它在 PATH 前面,bash 仍然使用旧的缓存路径。解决方案是运行以下命令,清空所有命令路径缓存:
  1. hash -r
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册