我如何在从源代码安装CMake后将其卸载?

我想更新我的cmake版本。所以我首先卸载了它,然后尝试按照this post by teocci中的说明进行安装。
然而,在输入make时出现了一些错误,现在我想卸载它并安装先前的cmake版本。我尝试了sudo apt-get purge cmake。但是在输入cmake --version后,它仍然存在于系统中。
我该怎么办?

你能把运行sudo apt-get purge cmake命令后得到的日志信息发出来吗? - AmeyaVS
谢谢回复。它显示0个升级,0个新安装,0个要删除和314个未升级。它还说使用'apt-get autoremove'来删除上面列出的一些文件。然而,我不愿意使用autoremove,因为它在过去删除了一些重要文件。 - Surabhi Verma
你使用的是哪个版本的Ubuntu?cmake --version命令显示的cmake版本是多少?另外,执行which cmake命令的输出是什么? - AmeyaVS
Ubuntu 14.04,cmake版本3.9.0-rc5,/usr/local/bin/cmake - Surabhi Verma
看起来你按照链接中的答案进行的cmake安装步骤仍然安装了Ubuntu软件包管理器无法跟踪的应用程序安装。你需要手动删除这个cmake安装的文件(在删除文件时要小心,不要错误地删除任何重要的系统文件!)。 - AmeyaVS
好的,没问题。我该如何手动操作呢? - Surabhi Verma
1@SurabhiVerma 请不要尝试手动删除文件。我相信CMake支持自动卸载,并且我预计很快会发布一个答案。我认为 CMake支持从您运行sudo make install的相同位置运行sudo make uninstall。(您自己创建并使用CMake生成构建脚本的程序不会自动支持此功能,但我相信CMake会。)我现在正在编译CMake来测试它,如果它有效,我会回答您,如果无效,我会进行评论。即使我错误地认为这个方法有效,我仍然建议您在手动删除文件之前等待其他答案一段时间。 - Eliah Kagan
好的。我还没有开始手动删除它。但是我已经删除了那个目录(我输入sudo make install的地方)。 - Surabhi Verma
1@SurabhiVerma 你可以通过重复安装的步骤来重新获取它。只要你使用相同的版本(即从相同的.tar.gz文件开始),并且传递完全相同的选项(如果你使用了任何选项)给./bootstrap,那么当你安装它时,它将安装相同的文件(无害地覆盖它们),然后你可以运行sudo make uninstall。但在我完成检查sudo make uninstall是否确实能够卸载CMake之前,你可能想等一下再尝试这个方法。(我会确保在我的回答中提到这种情况。) - Eliah Kagan
好的..希望能行..祈求好运 :/ - Surabhi Verma
@EliahKagan sudo make uninstall确实可以工作,但它仍然保留了目录结构,这可能是您希望删除的空目录。对于之前的评论,我表示抱歉。 - AmeyaVS
1个回答

TL;DR: 在运行sudo make install命令的目录中,先运行sudo make uninstall

你按照这个方法安装了不同版本的CMake。也就是说,你卸载了Ubuntu软件包管理器提供的版本,并从源代码手动下载、编译和安装了它。

假设你成功地按照这些说明操作,那么通过Ubuntu软件包管理器提供的CMake版本(通过cmake软件包)已经被卸载了。因为你现在安装的版本不是由Ubuntu软件包管理器提供的,而是你自己编译和安装的版本,再次运行sudo apt-get purge cmake并不会将其删除。

由于你通过编译并运行sudo make install来安装cmake,所以解决办法是:

  1. 使用cd命令返回到你运行该命令的目录。
  2. 运行sudo make uninstall
不是所有可以通过运行make install来安装的软件都有相应的uninstall目标,让您可以运行make uninstall来删除它。但是CMake支持这一点。1 如果您已经删除了运行sudo make install的文件夹,或者以其他方式更改了它,那么最好的办法是重新构建和重新安装它(确保使用完全相同的版本),以恢复运行sudo make uninstall的能力。也就是说,您将按照相同的安装步骤进行操作,从相同的.tar.gz文件开始,并传递所有相同的选项(如果有的话)给./bootstrap。如果您只是在后面没有参数的情况下运行了./bootstrap,请再次运行它。再次运行sudo make install后,它会(无害地)覆盖已经安装的文件,并用它们自己的副本替换它们,然后您就可以使用sudo make uninstall了。
另一种可能的方法,我强烈不建议你这样做,是尝试准确地找出安装过程中创建的文件和目录,并仅删除这些文件和目录,而不删除其他任何文件。如果在编译CMake时没有传递--prefix./bootstrap,那么它会将文件安装在/usr/local目录下,但这并不是唯一使用该目录的程序。它还会在/usr/local的各个子目录(如binlib等)中安装文件,所以除非你确定没有其他文件安装到/usr/local,否则这个选项需要大量工作。
1. 对于是否可以通过运行sudo make uninstall来卸载CMake,很容易产生困惑,因为默认情况下,当您使用CMake为自己的软件创建构建脚本时,除非您明确要求,否则不会生成uninstall目标。然而,CMake本身被设计成易于卸载,并且其源代码确实为自身定义了这些卸载目标。在运行./bootstrap后生成的Makefile中,您可以看到:
#=============================================================================
# Target rules for targets named uninstall

# Build rule for target.
uninstall: cmake_check_build_system
    $(MAKE) -f CMakeFiles/Makefile2 uninstall
.PHONY : uninstall

# fast build rule for target.
uninstall/fast:
    $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build
.PHONY : uninstall/fast

你还可以在它的CMakeLists.txt文件中搜索卸载支持
为了确保,我使用CMake 3.9.0进行了测试,它是可以工作的。uninstall目标已生成,并且运行sudo make uninstall可以卸载CMake。

非常感谢。安装需要一些时间...所以在此期间,我想问一下,如果我现在想要一个更新的cmake版本(例如Ubuntu软件包管理器提供的版本,而不是我手动安装的版本),我应该怎么做? - Surabhi Verma
@SurabhiVerma 我很高兴这个方法有效! 关于如何升级:这取决于你安装的CMake出了什么问题?发生了什么错误?你安装了哪个版本?为什么Ubuntu上的版本不够用?你只是想尝试一个更新的版本吗?(当然可以,但如果有更具体的原因,可能会更有意义。)你是在尝试构建需要较新版本CMake的东西吗?如果是的话,是什么东西?你应该单独提问这个问题,但如果你稍微解释一下情况,也许我可以建议其他一些要包含在问题中的内容,以便更容易回答。 - Eliah Kagan
我想要一个新版本的cmake函数(用于pybind11),所以我需要3或以上的版本。所以我卸载了cmake(版本2.8.2),然后按照我提到的过程安装了一个新版本。但是在运行make时,我遇到了以下错误:“make: /usr/bin/cmake: Command not found”。所以我删除了我安装新版本的那个文件夹,并运行sudo apt-get install cmake来重新安装旧版本,但是它抛出了这个错误:“CMake Error: Error executing cmake::LoadCache(). Aborting”。所以我认为可能是我没有安装正确,所以我又将其删除了。 - Surabhi Verma
@SurabhiVerma 显然,pybind11无法找到您自己安装的cmake命令,因为它期望它在/usr/bin/cmake目录下,这似乎是一个bug,但可以通过一些方法解决。CMake 2.8.2版本相当旧;Ubuntu 14.04有CMake 2.8.12。您使用的是哪个Ubuntu版本?请提供lsb_release -rdapt-cache policy cmake | grep -oP 'Candidate: \K.+'的输出结果。您是如何下载pybind11的源代码的?它是哪个版本(还是从git上检出的最新版本)? - Eliah Kagan
Ubuntu 14.04,2.8.12.2-0ubuntu3(哎呀,我记错了...我以为我在某个地方看到它是版本2.8.2)。我刚刚克隆了git存储库并将其添加到我的软件包中...哦,我还记得执行了'conda install -c conda-forge pybind11'。 - Surabhi Verma
@SurabhiVerma 好的,我建议您发布一个关于安装pybind11的问题的新帖子。请包括错误信息,并说明您是如何下载pybind11源代码的(下载文件的名称是什么?还是使用了git?),您下载的cmake版本以及其.tar.gz文件的完整名称,uname -m命令的输出,以及您在这里提供的所有信息,包括发行版(14.04)和系统提供的cmake版本(2.8.12.2-0ubuntu3)。如果您在此处留下一个链接指向您的新问题,我会查看它,尽管可能会有其他人先找到并发布解决方案。 - Eliah Kagan
@SurabhiVerma 你好,你目前是否已经安装了Anaconda,并且打算在Anaconda提供的Python环境中使用pybind11?你是如何安装Anaconda的?你想要在Python虚拟环境(virtualenv)中安装pybind11还是整个系统都安装?如果你一开始无法回答所有问题,那也没关系,但请尽量提供你所知道的信息。如果你不记得你尝试安装pybind11的详细步骤,请考虑重新安装一次,这样你就可以描述你所采取的步骤和看到的提示信息。如果你正在使用任何在线指南,你也可以在问题中提供链接。谢谢! - Eliah Kagan
是的,我在我的系统中安装了Anaconda。我按照这个来安装它。我仍然保留着Ubuntu预装的Python版本,而且我认为Anaconda会负责创建一个不同的虚拟环境。每当我输入python --version时,显示的是我下载的最新版本的Python。嗯,我只是克隆了git仓库...之前我不知道这个仓库,所以我只是通过conda安装了pybind11。但是,在cmakelists中,我仍然将git仓库路径包含进去,而不是在系统中找到该库。 - Surabhi Verma
pybind11的安装从来都不是个问题..实际上,在我需要更新cmake版本后,运行make时从未遇到上述错误..结果一切乱了起来,现在我没有任何cmake版本..所以我想知道最好的安装最新版本的方式..因为按照teocci提供的方法(如问题中所述),cmake并没有安装在默认的/usr/bin位置。 - Surabhi Verma
@SurabhiVerma 我猜,当你安装pybind11时,它看到了/usr/bin/cmake并且仍在使用它,如果你重新安装pybind11,它将会找到现在的cmake位置。但这只是我的猜测,可能还有其他更有效、更简单或者更好的解决方案。我仍然建议你发布一个新问题来询问这个。conda是安装Python工具的好方法,比起Git来安装pybind11更好。我之前提到Git只是为了找出你所拥有的pybind11版本(这仍然相关),以及因为我认为你无法成功安装它。 - Eliah Kagan
@SurabhiVerma 或许有一种方法可以告诉已安装的pybind11使用/usr/local/bin/cmake。或者一个快速修复方法是将/usr/bin/cmake建立符号链接到它。如果pybind11不依赖于它认为已安装的CMake版本或CMake的其他文件所在位置(我对pybind11了解不够,需要检查才能确定),这个方法可能有效。或者你可以使用前缀/usr/bin重新构建CMake,并使用checkinstall(因为带有该前缀的sudo make install不安全)。如果你发布一个关于如何使pybind11使用新的CMake的新问题,那么找出解决方法会更容易,而且其他人也可以看到并提供帮助。 - Eliah Kagan
2我通过这个链接安装了cmake,现在make命令可以正常工作了。谢谢你的帮助 :) - Surabhi Verma
@SurabhiVerma 好主意,真希望我能想到用update-alternatives来解决这个问题!:) 很高兴问题已经解决了。 - Eliah Kagan
我认为没有必要以root身份执行“卸载”操作。 - Felix Crazzolara
非常感谢!帮了我很多忙。 - Salvador Vigo