如何通过CMake实现不同版本的构建系统切换?

摘要:通过 update-alternatives 管理多个 CMake 版本可解决兼容性问题,但需注意清除 Shell 命令哈希缓存以确保切换生效。
1. 引言 在使用 CMake 构建 C/C++ 程序的时候,会遇到 CMake 版本兼容性问题。比如笔者构建 gflags 的时候提示: 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=ON CMake Error at CMakeLists.txt:73 (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed from CMake. Update the VERSION argument <min> value. Or, use the <min>...<max> syntax to tell CMake that the project requires at least <min> but has been updated to work with policies introduced by <max> 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 Cache Error: could not find CMAKE_PROJECT_NAME in Cache /home/ubuntu/projects/charlee-blog ubuntu@VM-0-7-ubuntu:~/projects/charlee-blog$ cmake --version cmake 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,例如笔者的情况是: ubuntu@VM-0-7-ubuntu:~/projects/charlee-blog$ cmake --version cmake version 4.1.2 CMake 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 目标版本即可,解压即用,无需安装。
阅读全文