如果我从源代码构建一个软件包,如何完全卸载或删除它?

我使用源代码构建了一个包,如下所示:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libexecdir=/usr/lib --with-package-name="Myplugin" --with-package-origin="http://www.ubuntu.org/" --enable-gtk-doc --disable-static
make
make install

但不幸的是,我发现这是最新版本,而且有很多错误,所以我需要将其删除/卸载。但是我该如何做呢?我尝试了make clean; make uninstall,但仍然看到它存在:
# pkg-config --list-all | grep Myplugin
myplugin-....
$ ls /usr/lib/myplugin/libXYZ.so
exist....

怎么现在移除这个?
10个回答

通常你可以直接使用:
make uninstall

或者

sudo make uninstall

如果应用程序以root身份安装。
但是,这只有在软件包的开发者注意到制定一个良好的卸载规则时才有效。
您还可以尝试通过运行以下命令查看安装软件所使用的步骤:
make -n install

然后尝试手动逆转这些步骤。
为了避免这种问题,在未来尽量使用checkinstall而不是make install(除非您想同时保留已编译和打包的版本)。它将创建并安装一个deb文件,您可以使用喜欢的软件包管理器进行卸载。 make clean通常用于清理构建目录,而不是卸载软件包。当您希望确保整个项目被重新编译时使用,而不仅仅是更改的文件。

60使用checkinstall真是太棒了,它能让这个问题迎刃而解。 - Oli
8如果使用"make uninstall"命令无效,你需要追踪"make install"的操作并手动撤销它。 - Javier Rivera
1make uninstallmake clean之后能起作用吗?我认为需要确保它仍然以相同的方式进行了配置。 - user606723
@user606723 make clean 不会撤销 ./configure,它只会撤销 make。要"取消配置"的唯一方法是删除 Makefile 本身(可能还有 config.h),或者再次运行 ./configure - MestreLion
4另一个需要记住的事情是,如果以root身份运行了make install(例如,sudo make install),这通常是情况,那么几乎总是需要运行sudo make uninstall来删除软件。 - Eliah Kagan
1+1 是给 checkinstall 的,因为它提到了 auto-apt,可以自动解析缺失的头文件依赖项! - Daniel Sokolowski
7如果你已经运行了 make install,你仍然可以使用 checkinstall。通常情况下,checkinstall 会覆盖 make install 创建的所有内容。之后只需使用 dpkg -r <package.deb>,一切都应该被移除。 - user502144
那就意味着我必须保留源代码吗? - ssynhtn

我不认为这是一个错误,阅读并学习如何在安装源码时使用checkinstall可能是个好主意。
你可以从软件仓库中安装checkinstall,以下是该软件的简短描述:
CheckInstall会跟踪由安装脚本("make install"、"make install_modules"、"setup"等)创建或修改的所有文件,构建一个标准的二进制软件包,并将其安装到你的系统中,使你能够使用发行版的标准软件包管理工具进行卸载。
以下链接可能有助于更好地理解: http://en.wikipedia.org/wiki/CheckInstall

http://checkinstall.izto.org/


这不是一个错误 - 从源代码编译是一种绕过软件包管理系统(Software Centre使用的系统)完全的不支持的安装方法。
没有标准的方式来安装或卸载从源代码编译的软件,所以Ubuntu无法知道该怎么做。该软件甚至没有列为已安装的程序。
您应该按照发行商的安装和卸载自定义软件的说明进行操作。您也可以联系开发人员,要求他们创建一个Debian软件包,以便可以使用软件包管理系统。

Make

Make是一个用于从源代码编译和安装程序的程序。它不是一个包管理器,因此不会跟踪安装的文件。这使得之后卸载文件变得困难。

make install命令将构建的程序和软件包复制到库目录和makefile指定的位置。这些位置可以根据configure脚本执行的检查而有所不同。

CheckInstall

CheckInstall是一个用于安装或卸载从源代码编译的程序的程序。它监视并复制使用make程序安装的文件。它还使用软件包管理器安装文件,这使得它可以像任何常规软件包一样被卸载。

checkinstall命令调用make install命令。它监视已安装的文件并从中创建二进制软件包。它还使用Linux软件包管理器安装二进制软件包。

请在截图中使用您自己的信息替换source_location.debname

Screenshot

在源代码包目录中执行以下命令:
  1. 安装 CheckInstall

    sudo apt-get install checkinstall
    
  2. 运行配置脚本

    ./configure
    
  3. 执行 Make 命令

    make
    
  4. 运行 CheckInstall

    sudo checkinstall
    
  5. 重新安装软件包

    sudo dpkg --install --force-overwrite source_location.deb
  6. 移除软件包

    sudo apt remove name

这是我写的一篇文章,详细介绍了整个过程并附有解释。


这不是一个bug,而是当开发者通过源码分发而不是本地打包方法时发生的情况。
你可以使用checkinstall或dhbuild将源文件转换为Debian软件包。 老实说,在我看来,新用户应该避免从源码安装,而开发者也应该避免仅通过源码分发。

我知道,但有时是不可避免的...在这种情况下,这只是一个小游戏,不是真正必要的,但之前我不得不安装MATLAB,这是我大学使用的计算工具,并且由于他们没有适用于Ubuntu的deb文件,所以我不得不通过源代码进行安装...但我一定会尝试使用checkinstall和dhbuild方法...谢谢。 - nik90

我们需要商讨一个事实,即make uninstall并不总是有效的,所以以下更多是一种积极的解决方案。

这涉及使用Ubuntu软件中心提供的paco程序。一旦我们安装了paco,我们可以在“make install”程序时使用它的日志模式。Paco就像是你的“make install”的包装器,并在/var/log/paco目录下创建一个日志,列出了复制到各个目录的文件。此外,你还可以在Paco前端看到这些文件。

例如,当我从源代码编译php时,我按照以下步骤进行:
paco -lp php5 "make install"

参数l使paco以日志模式运行。这将在/var/log/paco中创建一个名为php5的日志文件(这是我在命令中给出的名称)。它包含了在安装过程中复制到各个标准位置的所有文件。您可以使用命令行编辑器或paco图形界面来查看这些文件。

以下是使用sed命令行编辑器获取文件列表的示例
(将php5替换为您的文件名)。
cat /var/log/paco/php5 | sed -n 's/|\(.*\)//;/^#\(.*\)/d;p'

一旦你得到文件列表,你知道如何删除它们,对吧?实际上,你可以使用反引号将上述命令的结果传递给rm,就像下面所示:
sudo rm `cat /var/log/paco/php5 | sed -n 's/|\(.*\)//;/^#\(.*\)/d;p'`

工作完成!
注意:由于LD_PRELOAD的限制,paco无法跟踪suid程序的轨迹。请参阅man页面。

1checkinstall 没有对我起作用。 paco 被 porg 替代,但是我能够使用 porg 卸载。 - BadK
@BadK,是的,现在porg是首选解决方案。 - sjsam

我知道有一些支持"make uninstall"的软件包,但更多的是支持使用"make install DESTDIR=xxx"进行分阶段安装。
您可以使用这个方法创建一个软件包,然后安装它,而不是直接从源代码安装。我在使用checkinstall时没有成功,但fpm非常好用。
这也可以帮助您删除之前使用"make install"安装的软件包。您只需将构建好的软件包强制安装到已经通过make安装的软件包上,然后再卸载它。
例如,最近我使用这种方法处理protobuf-3.3.0。 在RHEL7上:
make install DESTDIR=dest
cd dest
fpm -f -s dir -t rpm -n protobuf -v 3.3.0 \
 --vendor "You Not RedHat" \
 --license "Google?" \
 --description "protocol buffers" \
 --rpm-dist el7 \
 -m you@youraddress.com \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 --rpm-autoreqprov \
 usr

 sudo rpm -i -f protobuf-3.3.0-1.el7.x86_64.rpm
 sudo rpm -e protobuf-3.3.0      

如果可以的话,更喜欢使用yum而不是rpm。
在Debian9上:
make install DESTDIR=dest
cd dest
fpm -f -s dir -t deb -n protobuf -v 3.3.0 \
-C `pwd` \
--prefix / \
--vendor "You Not Debian" \
--license "$(grep Copyright ../../LICENSE)" \
--description "$(cat README.adoc)" \
--deb-upstream-changelog ../../CHANGES.txt \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 usr/local/bin \
 usr/local/lib \
 usr/local/include

 sudo apt install -f *.deb
 sudo apt-get remove protobuf

更喜欢使用apt而不是dpkg,如果可以的话。
我还在stackoverflow上发布了这个答案。

如果您的用户使用“make install”和“make uninstall”无法正常工作,您可以手动删除已安装的文件。
停止redis服务:
service redis_6379 stop

现在从 /usr/local/bin/ 删除所有与 Redis 服务器相关的内容:

rm /usr/local/bin/redis-*

删除Redis配置文件目录:
rm -r /etc/redis/
删除现有的 Redis 数据目录:
rm -r /var/lib/redis/

删除现有的 Redis 服务器初始化脚本:

rm /etc/init.d/redis_*

删除现有的 Redis PID 文件(仅在存在时):

rm /var/run/redis_*

重新启动您的服务器,现在Redis已完全从您的服务器中删除。

如果您使用传统方法安装了源代码,您可以重新安装软件包,将自己放在运行sudo make install的相同目录中,并运行sudo checkinstall。 然后,您只需键入sudo apt-get purge $program_name即可卸载它。

我从源代码编译了 php-5.6.30,但没有配置openssl,所以我不得不重新从头安装它。使用make uninstall 无法 正常工作,因为php的Makefile不支持它。

然而,这一步对我有效 - 我列出了与php相关的所有文件,并手动将它们删除,大约花了我5分钟而毫不费力。您可以类似地使用这些步骤卸载您编译的软件。

php替换为您需要卸载的软件

whereis php

上述命令列出了安装二进制文件的目录,例如:/usr/local/bin/php, /usr/bin/php .. 删除输出中列出的每个文件/目录。

sudo rm -f /usr/local/bin/php

对上述输出中列出的所有文件执行此操作,然后您就可以开始从头安装更新版本。