如何通过命令行安装最新版本的cmake?

我正在尝试在我的Linux系统上安装最新的cmake,但总是遇到以下异常 -
userName@phx5qa01c-4e23:~/build$ wget http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz
--2013-10-08 14:39:55--  http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz
Resolving www.cmake.org... 66.194.253.19
Connecting to www.cmake.org|66.194.253.19|:80... failed: Connection timed out.
Retrying.

--2013-10-08 14:40:17--  (try: 2)  http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz
Connecting to www.cmake.org|66.194.253.19|:80... failed: Connection timed out.
Retrying.

--2013-10-08 14:40:40--  (try: 3)  http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz
Connecting to www.cmake.org|66.194.253.19|:80...

总是在重试... 有什么想法吗?

有人知道我在这里做错了什么吗?还是有更好的方法在我的Linux系统上安装最新版本的CMake?

userName@phx5qa01c-4e23:~/build$ uname -a
Linux phx5qa01c-4e23 2.6.35-22-server #33-Ubuntu SMP Sun Sep 19 20:48:58 UTC 2010 x86_64 GNU/Linux

你确定没有防火墙阻止你的连接吗?为什么要使用wget?试着用浏览器下载这个文件(http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz)。 - Eric Carvalho
类似的问题在这里:http://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04 有一个很好的答案。 - Elliptical view
我觉得你的问题是“如何在Linux中安装最新版本的cmake”,但是命令sudo apt-get install cmake并不能安装最新版本。 - Teocci
https://askubuntu.com/a/952929/579410 - KindDragon
以下的回答对我没有帮助,但是这个回答对于“在通过WSL运行的Ubuntu 18.04.3 LTS上安装最新的cmake:OpenSSL错误”非常有用:https://askubuntu.com/a/1205458/1191005我还不得不使用这个回答来解决“由于未满足的依赖关系无法安装libssl1.0.0:i386”的问题:https://askubuntu.com/a/1253788/1191005 - Tatiana Racheva
12个回答

最常见的情况是,当您想要安装最新版本的cmake时,但您的操作系统仓库没有更新。例如,在我的情况下,我有一台运行Ubuntu 16.04的笔记本电脑,当我执行命令sudo apt install cmake时,安装的版本是3.5.1,而不是当前版本3.25.1,当前版本可在cmake.org上找到。

Teo,我怎样才能得到最新版本?

嗯,我们可以通过以下方法之一进行安装:

  • 使用APT仓库
  • 从源代码构建和安装
  • 使用二进制文件

A. 使用APT仓库(推荐给普通用户)

Kitware现在提供了一个支持Ubuntu 16.04、18.04和20.04的APT仓库。因此,我们可以按照以下步骤轻松安装:

A-1.通过以下方法卸载由Ubuntu软件包管理器提供的默认版本和配置:

sudo apt remove --purge --auto-remove cmake

或者:

sudo apt purge --auto-remove cmake

A-2。准备安装

sudo apt update && \
sudo apt install -y software-properties-common lsb-release && \
sudo apt clean all

A-3. 获取kitware的签名密钥副本。

wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null

A-4. 将kitware的软件源添加到Ubuntu Focal Fossa(20.04)、Ubuntu Bionic Beaver(18.04)和Ubuntu Xenial Xerus(16.04)的源列表中。

sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main"

A-5. 作为一个可选步骤,建议我们还安装kitware-archive-keyring软件包,以确保Kitware的密钥环随着他们轮换密钥而保持最新。
sudo apt update
sudo apt install kitware-archive-keyring
sudo rm /etc/apt/trusted.gpg.d/kitware.gpg

如果运行sudo apt update出现以下错误:A-5.Note
Err:7 https://apt.kitware.com/ubuntu bionic InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6AF7F09730B3F0A4
Fetched 11.0 kB in 1s (7552 B/s)

复制公钥6AF7F09730B3F0A4并运行以下命令:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4

最后我们可以更新和安装cmake软件包。
sudo apt update
sudo apt install cmake

B. 建立和安装(推荐给开发者)
对于这种方法,您需要安装GCC工具:
sudo apt update
sudo apt install build-essential libtool autoconf unzip wget

B-1. 卸载Ubuntu软件包管理器提供的默认版本,如A-1中所示。

B-2. 访问官方CMake网页,然后下载并解压最新版本。更新以下命令中的versionbuild变量以获取所需版本:

version=3.25
build=1
## don't modify from here
mkdir ~/temp
cd ~/temp
wget https://cmake.org/files/v$version/cmake-$version.$build.tar.gz
tar -xzvf cmake-$version.$build.tar.gz
cd cmake-$version.$build/

B-3. 运行以下命令安装提取的源代码:

./bootstrap
make -j$(nproc)
sudo make install

B-4.测试您的新cmake版本。

$ cmake --version

cmake --version的结果:

cmake version 3.25.X

CMake suite maintained and supported by Kitware (kitware.com/cmake).

C. 使用二进制文件(cmake-gui 可能无法正常工作)

C-1. 卸载 Ubuntu 包管理器提供的默认版本,如 A-1 中所述。

C-2. 访问 官方 CMake 网页,然后下载并安装.sh 版本的最新版opt/cmake 目录。更新以下命令中的 versionbuild 变量以获取所需的版本:

version=3.25
build=1
## don't modify from here
limit=3.20
result=$(echo "$version >= $limit" | bc -l)
os=$([ "$result" == 1 ] && echo "linux" || echo "Linux")
mkdir ~/temp
cd ~/temp
wget https://cmake.org/files/v$version/cmake-$version.$build-$os-x86_64.sh 
sudo mkdir /opt/cmake
sudo sh cmake-$version.$build-$os-x86_64.sh --prefix=/opt/cmake

C-3. 运行以下命令,将已安装的二进制链接添加到/usr/local/bin/cmake中:

sudo ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake

C-4. 按照B-4中的方式测试您的新cmake版本。

注意

3.25.X中,X表示我们定义为构建的版本的最后一部分。如果更新了cmake,则构建可能会发生变化。根据官方网页,最新发布版本为3.25.1。如果您想要上一个版本3.24.3,只需替换版本和构建参数,如下所示:

version=3.24
build=3
## don't modify from here
limit=3.20
result=$(echo "$version >= $limit" | bc -l)
os=$([ "$result" == 1 ] && echo "linux" || echo "Linux")
mkdir ~/temp
cd ~/temp
wget https://cmake.org/files/v$version/cmake-$version.$build-$os-x86_64.sh 
sudo mkdir /opt/cmake
sudo sh cmake-$version.$build-$os-x86_64.sh --prefix=/opt/cmake

观察

对于之前的CMake版本(3.19.7及以下),请记住文件名中在-Linux-x86_64.sh中有一个大写的L,而从3.20版本开始,它变成了小写的l-linux-x86_64.sh中。


23make install命令需要root权限。cmake --version命令只能在打开新终端后才能使用,因为cmake默认安装在/usr/local/bin/目录下,而不是/usr/bin/目录下。 - HD189733b
当我运行这个时,我遇到了一个错误 CMake Error: Could not find CMAKE_ROOT !!! 并且无法更新 cmake - Timothy Swan
2这不是更新的解决方案,而是安装 cmake 的方法。尝试执行此命令或者搜索以下命令以查找解决方案:sudo apt-get remove cmake cmake-data - Teocci
@Teocci 我喜欢你的教程。只是一个提示:为了获得ccmake(CMake的curses界面)的构建和安装,首先需要运行sudo apt-get install libncurses-dev(参见这里这里这里)。 - Florian
1构建cmake-gui工具需要在引导命令中添加--qt-gui选项。 - Richard Whitehead
1apt purge 包括了 apt remove,所以执行以下命令是没有意义的: sudo apt remove cmake; apt purge cmake只需执行 apt purge 即可。 - gerardw
指令集 A 产生的结果是:bash: /usr/bin/cmake: 没有那个文件或目录。而指令集 B 运行正常。 - Sandu Ursu
安装完成后,您可能希望将cmake工具的所有符号链接到/bin目录中,而不仅仅是cmake本身。您可以使用以下命令之一来实现:sudo cp -s /opt/cmake/bin/* /usr/local/bin 或者 sudo cp -s /opt/cmake/cmake-$VERSION-Linux-x86_64/bin/* /usr/local/bin,具体取决于您选择是否在带版本号的目录中安装cmake - BeeOnRope
非常实用的指南,而且对我来说真的很有效...其他我找到的都没有涵盖从开始到结束的过程。 - BusyProgrammer
我尝试了B,但是cmake --version告诉我“找不到命令'cmake'”。 - Anakin
@Anakin 如果你遇到 bash: /usr/bin/cmake: No such file or directory 的错误,请参考HD189733b的上面被赞同的评论。 - leekaiinthesky
@Teocci 或许在 A-4 步骤中添加 . ~/.profile. ~/.bashrc 来解决这个问题。非常感谢您的答案! - leekaiinthesky
为什么不使用Kitware的APT存储库来支持16.04版本的CMake呢? - Alex Reinking
Kitware现在发布他们的源文件并使用Github进行分发,他们网站上的链接已经更新为以下格式:https://github.com/Kitware/CMake/releases/download/v$version/cmake-$verison.$build-Linux-x86_64.sh 但是wget可能无法下载该文件,所以您需要手动下载它并像往常一样运行剩下的命令。 - Mor Paz
2我的可怜笔记本在执行“make”时刚刚死机了,我不得不进行硬关机。也许最好不要使用所有核心?-j $(( $(nproc) - 2 ))? - Dan Oak
对于解决方案A,您可能需要按照https://askubuntu.com/a/1390307/312805进行操作。 - david
A 指令在 Ubuntu 22.04 上完美运行,cmake 版本为 3.23.2。 - bim
@Teocci:太好了。我已经成功地使用步骤A安装了“使用APT存储库(推荐给普通用户)”。但是,您能告诉我如何撤销这个步骤吗?我的意思是,我想删除通过APT存储库安装的cmake。 - BZKN
1@BZKN 只需运行 sudo apt remove --purge --auto-remove cmake - Teocci
回复:版权和内容许可证,详细请阅读https://askubuntu.com/help/licensing - 在此公开发布的所有内容都自动获得特定版本的CC BY-SA许可证。这一点在SE网络的各个地方都有提及,包括服务条款和帮助中心。因此,所有内容都属于CC BY-SA许可证。这意味着允许进行混合、修改等操作,用于任何目的-因此我认为任何贡献的编辑都是合法的,符合TOS的规定。如果您希望使用不同的许可证,请不要在Ask Ubuntu/Stack Exchange上发布内容。 - Thomas Ward
1@ThomasWard 你在和谁说话?是我吗?我没有谈论版权。首先,这篇帖子是根据CC BY-SA 3.0许可证发布的,所以你可以分享和修改。这意味着什么?简单来说,你可以分享链接,在你的公司使用它,通过复制内容并放在你的个人页面、博客中进行修改,或者在你自己的回答中引用部分内容。但这是原始帖子。我给你举个例子,大家都知道《蒙娜丽莎》,假设它是根据这个许可证发布的,你能去涂改它,给她涂上红唇之类的吗?当然不能,你可以制作一份副本并进行修改。 - Teocci
我不得不运行sudo ln -s /usr/local/bin/cmake /usr/bin/cmake才能让它正常工作 - undefined

Kitware现在有一个APT仓库,目前支持18.04、20.04和22.04版本。
所有仓库都支持AMD64、ARM32、ARM64架构,而18.04版本还支持x86架构。
安装说明:
  1. 删除旧版本的cmake

    sudo apt purge --auto-remove cmake
    
  2. 获取签名密钥的副本

    wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
    
  3. 将存储库添加到您的源列表中

    a. 对于Ubuntu Jammy Jellyfish (22.04)

    sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ jammy main'
    

    b. 对于Ubuntu Focal Fossa (20.04)

    sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main'     
    

    c. 对于Ubuntu Bionic Beaver (18.04)

    sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'
    
  4. 更新并安装

    sudo apt update
    sudo apt install cmake
    

9目前为止最佳解决方案,但存储库不支持arm64架构。 - Victor Lamoine
1相关链接:https://cmake.org/download/ https://apt.kitware.com/ - wisbucky
1不安全的仓库错误W: GPG 错误: https://apt.kitware.com/ubuntu bionic InRelease: 以下签名无法验证,因为公钥不可用: NO_PUBKEY 291F9FF6FD385783 E: 仓库 'https://apt.kitware.com/ubuntu bionic InRelease' 未签名。 N: 不能从这样的仓库进行安全更新,默认情况下已禁用。 N: 有关仓库创建和用户配置详细信息,请参见 apt-secure(8) 手册页。最好使用下面的 PIP 方法。 - Bizmate
第一步是必要的吗?它应该无论如何升级,对吗? - Abhineet Pandey
@Bizmate 这个链接应该会有所帮助:点击这里 - JoeVictor
对我来说,只有python3.6有效,而python3.11python3.9无效。 - user2340939

我喜欢以下的方式,因为你可以轻松地获取最新版本而不会遇到太多麻烦。
Kitware似乎正式支持pip wheels发布。所以你只需执行以下命令即可获取最新的cmake:
``` pip install --upgrade cmake ```
这是关于此的博客: https://blog.kitware.com/cmake-python-wheels/

4绝对是最有用的答案!真希望我一年前就想到了。谢谢! - Albino Cordeiro
4这可能是所有任务中最简单的一个! - Chris
2谢谢!这比其他选择要简单多了。 - RReverser
1很高兴听到大家觉得这个很有用。在我看来,这是最简单、最可靠的方式。而且它也得到了官方的支持。 - Juan Leni
谢谢。你写的步骤对我来说并没有完全奏效,但是经过一些小调整后,它们成功了:在20.04.1 LTS(Focal Fossa)上,我首先需要使用apt-get install -y python3-pip安装pip。然后我可以使用pip3 install --upgrade cmake安装Cmake。 - Simon Kissane
很遗憾,这个不会安装cmake-gui。 - stiv
2这对我有用,但只在打开一个新的终端后才有效。 - Dylan Kerler


13将链接从 /usr/local/bin/cmake 添加到已安装的二进制文件。这样就不需要更改 PATH。 sudo ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake - Christian
3这是最好的答案。 - SuB
3真的,这是对最初问题最有用的答案。 - amigo421
这给了我一个损坏的cmake-gui,无法在xRDP上工作(之前的版本可以工作),而xRDP是唯一访问服务器的方式。 - stiv
@stiv 1. 在安装完成后,你是否验证了cmake是否正常工作,并且在你的路径中没有其他cmake版本? 2. 你能否确认你正在使用安装提供的cmake-gui,而不是一些旧版本?(要知道版本,请在命令行中添加--version - Antonio
我肯定会向任何寻找预编译版本的x86-64 CMake的人推荐这个答案。 - dddJewelsbbb
使用for i in /opt/cmake/cmake-3.19.1-Linux-x86_64/bin/*; do sudo ln -s "$i" /usr/local/bin/"$i"; done命令可以创建所有的符号链接,并且可能修复上述提到的cmake-gui问题。 - studog
这在wsl上也能运行,顺便说一句。 - Anirudh
一个发布和一个值得绕过apt的功能是两回事。我昨天刚通过apt下载了cmake,它具备所有常见的功能。如果你担心使用最新版本的make,你应该在Debian上使用autotools。我在这里花了很多时间告诉人们不要做你回答中建议的事情。当你这样安装时,dpkg甚至都不知道这个软件包的存在。如果你打算用这种反向的方式来做,至少将其转换为.deb软件包,或者更好的是获取一个由维护者配置的真正软件包,并加载它... - Nate T
...手动使用dpkg -i将其安装到系统中。当您第一次尝试下载一个需要cmake作为依赖的软件包时,您会怎么做呢?您的cmake无法满足这个依赖关系。这只是许多类似问题之一,通过确保系统软件得到正确管理,可以避免这些问题。Ubuntu是一台精密运转的机器。只要保持润滑油充足,它将永远运行下去。如果我说话过于严厉,请原谅,但除非您绝对需要通过apt/snap以外的功能,否则您不应该这样做。 - Nate T
@NateT 这个问题是关于“如何获取最新版本的cmake”(即带有所有最新功能),这就是答案。如果你有更好的答案,请起草并发布它。 - Antonio
是的,这就是为什么我没有给任何答案点踩(点赞是我)。在那种情况下,仅仅因为他在虚拟机中且重新操作很容易,并不是什么大不了的事情。留下评论的原因是因为将来大部分需要这个资源的用户(那些对Linux环境不熟悉的新手)不会知道其中的区别。设身处地想象一下,如果你是一个新用户,来到这里后会有什么印象。我要删除一些评论了,开始看起来像涂鸦了:) - Nate T
这是唯一对我有效的答案!在第二步中,输入 y 以获取许可证,并输入 N 来添加额外的路径文件夹。 - Caleb Stanford

如果有人需要在Docker镜像中安装最新的CMAKE(就像我一样..)。这个例子是3.7.2版本,但你可以在这里https://cmake.org/download/检查,正如之前指出的那样。
#install latest cmake
ADD https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.sh /cmake-3.7.2-Linux-x86_64.sh
RUN mkdir /opt/cmake
RUN sh /cmake-3.7.2-Linux-x86_64.sh --prefix=/opt/cmake --skip-license
RUN ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake
RUN cmake --version

5很好,无文档的--skip-license选项 :) - 4LegsDrivenCat
1@4LegsDrivenCat,--help显示了这个选项,没有其他文档可供参考。 - vulcan raven
2@vulcanraven 这个功能在2018年12月1日的3.10.0版本中被添加到--help中。这个回答和我的评论是针对3.7.2版本的。 - 4LegsDrivenCat

可能www.cmake.org上的服务器很忙。你可以再试一次,或者使用你的网络浏览器下载文件。
然而,还有一种更简单的方法:
sudo apt-get install cmake

更新:评论者指出“Ubuntu 12.04只提供v2.8.7”和“14.04仍然提供2.8”。这是有原因的:12.04和14.04是Ubuntu的LTS版本。LTS版本旨在保持稳定5年,因此只接收安全和关键更新,而不是软件包的最新版本。正常版本每6个月发布一次,因此更有可能配备较新的cmake。

3Ubuntu 12.04只能通过apt-get获取到2.8.7版本的cmake。而当前最新版本是2.8.12。我建议您坚持从源代码构建它。 - Richard Hodges
92这不是正确的答案。最新版本几乎从来不在apt上。 - Senjai
314.04仍在运送2.8。 - Stolas
@Stolas和其他评论者:你们在提到Ubuntu的LTS版本(12.04,14.04)。在LTS版本中,你只会得到安全性和关键修复,而绝对不会升级软件包到最新版本。LTS版本的整个目的就是为了保证5年的稳定性,所以不会进行这样的升级。我会更新我的回答来解决这个问题。 - zwets
6这个答案是错误的。StableReleaseUpdates政策并不仅适用于LTS版本。一旦实际发布,所有Ubuntu版本只会获得安全漏洞修复或其他严重错误的修复。正如此处所示(以及在Launchpad上),即使非LTS版本也没有收到新的cmake版本。一些软件包确实存在单独的后备端口(但不包括cmake)。 - Eliah Kagan
@EliahKagan,回答错了吗?它并没有声称非LTS版本会收到软件包更新。(实际上,为什么要更新呢,因为下一个版本总是在6个月内发布?)我指出的是,如果你坚持使用LTS版本,你将不会得到cmake的更新。当Stolas写道“14.04仍然使用2.8”时,Wily已经发布了5个月,携带着cmake 3.2。一个月后,xenial发布了cmake 3.5。Zesty现在有3.7。然而,如果Stolas仍然使用14.04 LTS(可能还有两年),他们将始终得到2.8。编辑了我的答案,以便更清楚地表达这一点。 - zwets
16这个答案是错误的,因为sudo apt-get install cmake本身不会升级cmake到新版本。这在任何Ubuntu版本上都不起作用。如果你的答案实际上是“将你的Ubuntu系统升级到一个新版本”,那么你可能需要再次编辑以使其更清晰。(对于许多用户来说,这不是一个合理的解决方案,而且通常没有一个已发布的Ubuntu版本的存储库有最新版本的cmake。) - Eliah Kagan
+1 @EliahKagan required != stable* and stable != newer and *newer != required - dsgdfg

你可以通过 Snap 找到非常最新的 cmake 版本。例如,在撰写本答案时,cmake 的最新版本是 3.15.3,而 Snap 提供的是版本 3.15.2。
sudo apt-get purge cmake
sudo snap install cmake --classic

1假设你正在使用bash终端,之后可能需要运行hash -r命令来确保找到更新的cmake二进制文件。 - hertzsprung
@hertzsprung 这很重要,没有hash -r,我无法在终端上运行cmake二进制文件。 - Bằng Rikimaru

对于一个Docker容器,最好运行
RUN wget -qO- "https://cmake.org/files/v3.12/cmake-3.12.1-Linux-x86_64.tar.gz" | \
  tar --strip-components=1 -xz -C /usr/local

根据需要调整版本。

你还可以执行以下操作:
export fn=/tmp/cmake.sh && ls $fn && (echo "use previous $fn? Enter for yes, ctrl+d for no." && read) || (wget -O $fn http://www.cmake.org/files/v3.0/cmake-3.0.2-Linux-i386.sh 1>&2) && (cd /opt && sudo bash ${fn} && echo sudo ln -f -s /opt/cmake*/bin/cmake /usr/local/bin/cmake && cd -)

这个脚本
  • 获取 make 3.0.2 ** 如果在此会话中已经下载过,那么如果您没有完成安装,可以重用它
  • 然后它将复制 创建链接到 bin 目录下的 cmake

使用以下命令删除旧版本:

apt-get purge cmake

下载以tarball形式存档的cmake二进制版本。您可以通过将其bin目录路径添加到$PATH来使用新版本的cmake。另一种解决方案是解压tar.gz包并进入解压后生成的目录,然后运行以下命令:
cp -r bin /usr/
cp -r doc /usr/share/
cp -r man /usr/share/
cp -r share /usr/

第二种方法与安装过程相同,就像 .deb 包一样!