多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Ubuntu CMake安装卸载全攻略:APT、PPA、预编译包与源码编译

Ubuntu CMake安装卸载全攻略:APT、PPA、预编译包与源码编译 1. 项目概述在Linux开发环境里CMake绝对算得上是构建系统的“顶流”。无论是编译一个简单的C练习项目还是管理一个横跨多个平台、依赖复杂的开源库CMake都是绕不开的工具。尤其是在Ubuntu这个开发者最爱的发行版上如何高效、干净地安装和卸载CMake直接关系到后续开发流程的顺畅度。你可能刚从源码编译完一个项目发现CMake版本太旧或者想尝鲜最新特性需要升级到指定版本又或者系统里多个版本打架导致构建脚本报错。这些问题本质上都是对CMake的“生命周期管理”没做到位。我自己在团队协作和持续集成环境里就踩过不少坑。比如CI服务器上因为一个陈旧的CMake版本导致构建失败耽误了整个团队的进度又或者个人开发机上同时存在APT安装的稳定版和手动编译的最新版cmake --version输出的结果让人迷惑项目构建时链接了错误的库。所以今天我们就来彻底理清在Ubuntu上管理CMake的几种主流方式从最便捷的APT到最灵活的手动编译再到专为多版本共存的工具链管理我会结合具体场景和实操细节让你不仅能“装上”更能“管好”。2. 核心需求与方案选型解析2.1 为什么需要多种安装方式你可能会问sudo apt install cmake一条命令不就搞定了吗在大多数简单场景下确实如此。但深入开发后你会遇到更复杂的需求版本控制需求Ubuntu官方仓库的软件包版本通常比较保守以追求稳定性。例如Ubuntu 22.04 LTS默认提供CMake 3.22.1而许多较新的开源项目如某些版本的LLVM/Clang、或要求C20特定特性的项目可能要求CMake 3.24甚至3.26以上。这时官方仓库的版本就无法满足要求。环境隔离与多版本共存你可能同时维护多个项目A项目依赖CMake 3.18B项目需要CMake 3.25。全局只安装一个版本会引发兼容性问题。我们需要一种方式让不同项目或终端会话能方便地切换CMake版本。获取预发布版或特定修订版如果你想测试CMake即将发布的新功能或者某个项目的CI脚本锁定了某个具体的补丁版本如3.27.2从源码编译或使用官方预编译包是唯一的选择。对安装位置和依赖的完全控制通过APT安装的软件包其文件分布遵循FHS文件系统层次结构标准你无法轻易更改。而手动安装允许你将CMake安装到任何目录如/opt/cmake或家目录下便于打包、移植或在不具备sudo权限的环境中使用。2.2 四种主流方案全景对比面对上述需求我们主要有四种武器。选择哪一种取决于你的具体场景。方式核心命令/工具优点缺点适用场景APT 官方仓库sudo apt install cmake极其简单一键安装自动解决依赖通过系统统一管理。版本陈旧无法安装多个版本卸载可能残留配置文件。新手入门对版本无特殊要求的日常开发追求系统简洁稳定。APT PPA 第三方仓库sudo add-apt-repository ppa:...版本较官方仓库新依然享受APT的依赖管理和更新便利。依赖第三方维护者存在停更风险版本选择仍有限。需要比官方仓库更新的稳定版且信任PPA维护者。手动安装官方预编译包下载.sh或.tar.gz包解压版本最新最全无需编译下载即用可多版本共存灵活切换。需要手动管理路径和环境变量升级需重复下载操作。最推荐的主流方式。需要特定版本、多版本共存、或没有root权限。从源码编译安装./bootstrap make sudo make install版本完全自由包括git主线可定制编译选项理解构建过程。过程繁琐耗时需自行解决依赖管理不当易污染系统。需要绝对最新的git版本研究CMake本身或有极致的定制化需求。我的选择建议对于绝大多数开发者“手动安装官方预编译包”是平衡了灵活性与复杂度的最佳选择。它完美解决了版本控制和多版本共存的核心痛点。接下来我们将深入每一种方式的安装与卸载细节并重点分享预编译包方案中如何优雅地管理多个版本。3. 方案一使用 APT 安装与卸载这是系统最原生、最集成化的方式。所有操作都通过apt包管理器完成。3.1 安装CMake首先更新本地软件包索引确保获取到仓库中最新的版本信息sudo apt update然后直接安装cmake包sudo apt install cmake安装完成后验证版本cmake --version你会看到类似cmake version 3.22.1的输出以及CMake套件的位置。注意通过APT安装的CMake其二进制文件通常位于/usr/bin/模块文件位于/usr/share/cmake-version/配置文件可能位于/etc/下。这些都由dpkg严格管理。3.2 卸载CMake卸载同样使用apt命令。这里有几个不同清洁度的选项仅卸载软件包保留配置文件sudo apt remove cmake这个命令只删除二进制文件、库文件等但保留在/etc等目录下的配置文件。如果你打算未来重新安装同版本并保留配置可以用这个。彻底卸载删除软件包及配置文件sudo apt purge cmake这是更推荐的做法特别是当你因为版本冲突或配置错误想要一个“干净”的状态时。purge会删除软件包及其所有配置文件。卸载并自动移除不再需要的依赖 在remove或purge之后可以运行以下命令清理那些因为CMake而被自动安装但现在已不再被任何其他软件包需要的依赖库即“孤儿包”sudo apt autoremove你可以将purge和autoremove组合成一条命令sudo apt purge --auto-remove cmake实操心得在执行purge前如果你对CMake做过自定义配置虽然CMake本身很少需要改系统级配置可以备份一下/etc/cmake目录如果存在的话。卸载后可以检查相关目录是否已清理干净which cmake应该返回空ls /usr/bin/cmake*也不应再看到相关可执行文件。4. 方案二使用APT PPA安装与卸载PPAPersonal Package Archive是Launchpad.net提供的一项服务允许个人或团队构建并发布Ubuntu的软件包。KitwareCMake官方维护公司就提供了官方的PPA其中包含较新的稳定版本。4.1 安装CMake通过Kitware官方PPA首先添加Kitware的官方APT密钥和软件仓库。Kitware提供了专门的脚本让这个过程更可靠比直接add-apt-repository更好。安装依赖以通过HTTPS使用APTsudo apt update sudo apt install -y software-properties-common apt-transport-https wget下载并运行Kitware的官方安装脚本wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg /dev/null这条命令下载Kitware的公钥并将其转换为APT可识别的格式存入系统密钥环。添加Kitware的APT仓库源。请根据你的Ubuntu版本选择对应的命令Ubuntu 22.04 (Jammy):echo deb [signed-by/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main | sudo tee /etc/apt/sources.list.d/kitware.list /dev/nullUbuntu 20.04 (Focal):echo deb [signed-by/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main | sudo tee /etc/apt/sources.list.d/kitware.list /dev/null再次更新软件包列表并安装cmakesudo apt update sudo apt install -y cmake此时安装的CMake版本将会比Ubuntu官方仓库新得多例如在写作时该PPA提供3.28版本。重要提示添加第三方PPA需谨慎。Kitware是CMake的官方维护者其PPA可信度很高。但对于其他个人维护的PPA务必确认其活跃度和信誉以免引入安全风险或导致系统不稳定。4.2 卸载CMake并移除PPA如果你想彻底回归系统原状需要两步卸载CMake软件包sudo apt purge --auto-remove cmake移除Kitware的APT仓库源sudo rm /etc/apt/sources.list.d/kitware.list sudo rm /usr/share/keyrings/kitware-archive-keyring.gpg最后再次运行sudo apt update更新列表。注意事项通过PPA安装后CMake的升级将由sudo apt upgrade统一管理与系统其他软件包一起更新。如果你同时启用了多个提供CMake的仓库如系统官方和PPAAPT默认会安装版本最高的那个。你可以使用apt policy cmake查看所有可用版本及其优先级。5. 方案三手动安装官方预编译包推荐这是我最常用也最推荐的方式。CMake官方为Linux提供了预编译的二进制分发包是一个包含所有必要文件的.tar.gz压缩包解压即可使用无需编译。5.1 下载与安装访问下载页面 打开 CMake官方下载页面 。在“Binary distributions”部分找到Linux x86_64的压缩包。通常有两个选择cmake-version-linux-x86_64.tar.gz 这是包含文档和源码的完整包。cmake-version-linux-x86_64.sh 这是一个自解压安装脚本。 我更喜欢.tar.gz格式因为它更透明解压后所有文件一目了然也便于手动管理。使用命令行下载以3.28.3版本为例# 创建一个专门的目录存放CMake这里以家目录下的tools为例 mkdir -p ~/tools cd ~/tools # 下载特定版本的预编译包 wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.tar.gz # 解压 tar -xzf cmake-3.28.3-linux-x86_64.tar.gz # 为了便于管理可以创建一个不带版本号的软链接 ln -sfn cmake-3.28.3-linux-x86_64 cmake现在CMake的所有可执行文件都在~/tools/cmake/bin/目录下。配置环境变量 要让系统找到我们手动安装的CMake需要将其bin目录加入PATH环境变量。强烈建议只修改用户级别的配置避免影响系统其他用户。编辑你的shell配置文件如~/.bashrc用于Bash~/.zshrc用于Zshnano ~/.bashrc在文件末尾添加以下行# 将CMake添加到PATH export PATH$HOME/tools/cmake/bin:$PATH保存文件然后让配置立即生效source ~/.bashrc验证安装cmake --version现在输出的应该是你刚刚下载的版本如3.28.3。5.2 实现多版本共存与切换手动安装的最大优势在于可以轻松管理多个版本。假设你现在还需要一个旧的3.22.1版本用于某个老项目。下载并放置另一个版本cd ~/tools wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz tar -xzf cmake-3.22.1-linux-x86_64.tar.gz现在你的~/tools目录下应该有cmake-3.28.3-linux-x86_64和cmake-3.22.1-linux-x86_64两个文件夹。创建版本切换脚本 我们不直接修改PATH指向固定的软链接而是创建一个更灵活的切换机制。在~/tools目录下创建一个脚本例如use-cmake.sh#!/bin/bash # use-cmake.sh - 快速切换CMake版本 CMAKE_ROOT$HOME/tools if [ $# -eq 0 ]; then echo 当前激活的CMake版本 ls -l $CMAKE_ROOT/cmake echo echo 可用的版本 ls -d $CMAKE_ROOT/cmake-* 2/dev/null | xargs -I {} basename {} | sed s/cmake-// else VERSION$1 TARGET_DIR$CMAKE_ROOT/cmake-$VERSION-linux-x86_64 if [ -d $TARGET_DIR ]; then ln -sfn $TARGET_DIR $CMAKE_ROOT/cmake echo 已切换至 CMake $VERSION $CMAKE_ROOT/cmake/bin/cmake --version else echo 错误未找到版本 $VERSION。 echo 请确保目录 $TARGET_DIR 存在。 fi fi给脚本执行权限chmod x ~/tools/use-cmake.sh。使用脚本切换版本# 查看可用版本和当前版本 ~/tools/use-cmake.sh # 切换到 3.22.1 ~/tools/use-cmake.sh 3.22.1 # 切换到 3.28.3 ~/tools/use-cmake.sh 3.28.3每次切换~/tools/cmake这个软链接就会指向不同的版本目录而你的PATH$HOME/tools/cmake/bin始终指向这个软链接从而实现了全局版本的动态切换。实操心得路径优先级由于我们将~/tools/cmake/bin放在了PATH的最前面$PATH它会优先于系统自带的/usr/bin/cmake被找到。你可以用which cmake确认。项目级隔离对于更严格的项目级版本控制上述全局切换可能还不够。这时可以在项目的CMakeLists.txt开头使用cmake_minimum_required(VERSION 3.22)来指定最低版本并在项目根目录提供一个get_cmake.sh脚本自动下载并使用特定版本的CMake进行构建。或者使用cmake -DCMAKE_COMMAND/path/to/specific/cmake来指定。清理旧版本手动安装的版本卸载极其简单——直接删除对应的目录即可。例如要删除3.22.1版本rm -rf ~/tools/cmake-3.22.1-linux-x86_64。如果这个版本是当前激活的软链接指向它记得先切换到另一个版本再删除。6. 方案四从源码编译安装这种方式最耗时但给予你最大的控制权适合进阶用户或需要特定编译选项的场景。6.1 编译与安装步骤安装编译依赖 CMake本身需要C编译器、make和SSL库等来编译。sudo apt update sudo apt install -y build-essential libssl-dev下载源码 同样从CMake官网下载源码包格式为cmake-version.tar.gz。cd ~ wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz tar -xzf cmake-3.28.3.tar.gz cd cmake-3.28.3配置、编译与安装 经典的configure-make-make install三部曲。CMake源码使用自身的引导脚本bootstrap。# 配置构建参数。--prefix指定安装目录这里安装到/usr/local这是用户级软件的标准位置。 ./bootstrap --prefix/usr/local --parallel$(nproc) -- -DCMAKE_BUILD_TYPERelease # 编译。使用-j参数利用多核加速$(nproc)会自动获取你的CPU核心数。 make -j$(nproc) # 安装。这需要sudo权限因为要写入/usr/local。 sudo make install--parallel 让bootstrap过程也并行化。-DCMAKE_BUILD_TYPERelease 指定生成Release版本的CMake体积更小运行更快。验证cmake --version如果之前通过APT安装过系统可能会优先找到/usr/bin/cmake。因为/usr/local/bin通常在PATH中位于/usr/bin之后。你可以用/usr/local/bin/cmake --version来验证新编译的版本或者调整PATH顺序。6.2 卸载从源码安装的CMake从源码安装的软件卸载没有像apt那样的统一命令。因为make install只是将文件复制到--prefix指定的目录这里是/usr/local。卸载需要手动删除这些文件。幸运的是CMake的构建系统在编译目录下生成了一个install_manifest.txt文件它记录了所有被make install安装的文件路径。回到你的编译目录cd ~/cmake-3.28.3检查安装清单cat install_manifest.txt你会看到类似如下的列表/usr/local/bin/cmake /usr/local/bin/ctest /usr/local/share/cmake-3.28/... ...使用xargs批量删除操作前请务必仔细核对清单sudo xargs rm install_manifest.txt这条命令会读取install_manifest.txt中的每一行即每个文件路径然后传递给sudo rm命令进行删除。额外清理install_manifest.txt可能不会包含所有目录。安装后可能还需要手动删除空目录sudo rm -rf /usr/local/share/cmake-3.28 # 检查/usr/local/doc, /usr/local/man等目录下是否有cmake相关内容酌情删除注意事项与避坑指南谨慎操作手动删除系统文件是危险操作。务必在执行sudo xargs rm前确认install_manifest.txt中的路径都在/usr/local下且没有误包含其他重要文件。版本冲突如果你之前通过APT安装了CMake现在又在/usr/local下安装了一个新版本那么终端输入cmake时系统会使用PATH中先找到的那个。你可以用which cmake查看。想优先使用新版本可以调整PATH或者为编译版本创建别名如alias mycmake/usr/local/bin/cmake。编译失败如果./bootstrap或make失败通常是因为缺少依赖。仔细阅读错误信息安装对应的-dev包。一个更全面的依赖安装命令可能是sudo apt install build-essential libssl-dev libncurses5-dev。7. 故障排查与常见问题在实际操作中你可能会遇到以下问题。这里提供排查思路和解决方案。7.1 版本混乱与命令找不到问题安装了多个CMake后终端输入cmake --version显示的版本不是你期望的或者直接提示command not found。排查步骤确定当前PATHecho $PATH查看路径列表顺序决定了命令的查找优先级。定位命令which cmake或type cmake查看实际执行的是哪个路径下的cmake。列出所有安装# 查找所有可能的cmake可执行文件 sudo find / -name cmake -type f -executable 2/dev/null | grep -v snap | grep -v proc解决方案如果使用的是手动安装方案三确保你的PATH环境变量正确设置并且~/tools/cmake/bin位于系统路径如/usr/bin之前。如果是从源码安装到/usr/local方案四而系统APT版本在/usr/bin可以尝试在shell配置文件中调整PATHexport PATH/usr/local/bin:$PATH。最干净的做法是彻底移除不需要的版本。用apt purge移除APT安装的用删除目录或install_manifest.txt的方式移除手动安装的确保只保留一个你主动管理的版本。7.2 构建项目时提示CMake版本过低问题运行cmake ..时错误提示类似CMake 3.31 or higher is required. You are running version 3.25.2。原因项目要求的CMake最低版本高于你当前系统激活的版本。解决方案升级CMake根据本文介绍的方法安装满足要求的版本。对于这种较新的版本要求如3.31几乎肯定需要通过**方案三手动安装预编译包或方案四源码编译**来获取。验证版本安装新版本后重新打开终端运行cmake --version确认新版本已生效。清理构建缓存如果之前构建失败过务必删除项目中的build目录或CMakeCache.txt文件然后重新运行cmake。因为CMake会缓存一些信息旧版本的缓存可能干扰新版本。7.3 卸载后残留文件或配置问题使用apt remove后感觉系统里还有CMake的痕迹。排查与清理配置文件apt remove会保留配置文件。使用sudo apt purge cmake可以清除。也可以手动检查/etc/cmake/目录。用户缓存CMake会在用户家目录下生成缓存和配置。检查并清理rm -rf ~/.cmake rm -rf ~/.cache/cmake手动安装残留如果你曾经将CMake解压或安装到非标准路径如/opt、/usr/local或家目录需要手动查找并删除这些目录。可以使用上面的find命令辅助定位。7.4 多版本管理的最佳实践建议经过多年折腾我总结出以下管理原则能让你的开发环境更清爽系统层面保持干净除非有特殊理由否则不要通过APT安装CMake。让系统的/usr/bin/cmake保持原状或干脆移除。将系统包管理器留给它最擅长的——管理系统级依赖和基础服务。用户层面集中管理在用户主目录下如~/tools、~/apps或~/.local创建一个统一的目录来存放所有手动安装的开发工具CMake、特定版本的GCC、Clang、Ninja等。使用环境管理工具对于极其复杂的多版本、多项目环境可以考虑使用更专业的工具module 经典的环境模块系统在HPC领域广泛应用。可以通过module load cmake/3.28来加载特定版本。asdf 一个扩展性极强的多版本运行时管理工具支持数百种语言和工具包括CMake。通过插件和.tool-versions文件可以实现项目级的自动版本切换。项目级版本声明始终在你的CMakeLists.txt文件顶部使用cmake_minimum_required(VERSION x.y)。这不仅是一个良好的实践也能在版本不匹配时给出明确的错误提示而不是难以捉摸的构建失败。文档化环境配置在项目的README或CONTRIBUTING.md中明确说明构建所需的CMake版本以及推荐的安装方式例如“请通过Kitware官方PPA安装CMake 3.20”或“本项目使用asdf管理构建工具链”。这能极大减少新贡献者的环境配置时间。归根结底在Ubuntu上管理CMake核心矛盾在于系统的稳定性与开发的前沿性之间的平衡。没有一种方法适合所有场景。对于个人开发和学习我强烈建议从“手动安装官方预编译包”开始它简单、强大、可控。当你需要为整个团队或生产服务器部署一致的环境时可以考虑将特定版本的CMake预编译包放入内部仓库或者使用Docker容器来固化构建环境那又是另一个层面的最佳实践了。
返回列表