“ make install”的反义词是什么,即如何在Linux中卸载库?


396

在跑步的时候

./configure --prefix=/mingw 

在我之前运行的库的MinGW / MSYS系统上

'./configure --prefix=/mingw && make && make install' 

我遇到了此消息:

警告:已经安装了Vamp插件SDK版本。如果您安装了新版本而不先删除旧版本,那么会感到担心和悲伤。(续)

这让我担心。“ make install”的反义词是什么,即如何在Linux中卸载库?“清洁”会完成这项工作吗,还是有其他步骤涉及?



1
参见askubuntu.com/questions/87111/…获得类似的答案,当前的主要解决方案似乎是sudo make uninstall安装配置文件是否仍然可用,如果没有,则没有其他明显的解决方案。 “ 效用。
爱德华

7
运行后,make install我不需要make uninstall删除它们。我一直在使用xargs rm < install_manifest.txt
John Strood

Answers:


508

make clean从源代码/构建树中删除任何中间文件或输出文件。但是,它仅影响源代码/构建树。它不会接触文件系统的其余部分,因此不会删除以前安装的软件。

如果幸运的话,跑步make uninstall就可以了。但是,这取决于图书馆的作者。一些作者提供了一个uninstall目标,有的则没有。

如果您不走运,则必须手动将其卸载。运行make -n install可能会有所帮助,因为它将显示该软件自行安装但实际不执行任何操作的步骤。然后,您可以手动撤消这些步骤。


10
+1; 注意其他软件包也可能已安装的文件。简单地删除这些文件(一种解释为“手动撤消这些步骤”)可能会破坏其他软件包。这是(许多原因之一)发明包管理器的原因。
Merlyn Morgan-Graham

3
仅当您保持相同的已配置和已编译构建目录正确时,这才可能吗?因此并不是很有用,因为大多数人会在安装后将其删除。无论他是否保留构建文件夹,以及软件包是否已正确配置为make卸载选项,他都希望卸载。澄清:他想做的就是对某种适用于他自己编译的程序的软件包进行某种管理。
Nisse

360

如果sudo make uninstall不可用:

在基于Debian的系统中,make install您可以运行sudo checkinstall以制作一个.deb自动安装的文件,而不是(或在之后)。然后,您可以使用系统软件包管理器(例如apt/ synaptic/ aptitude/ dpkg)将其删除。Checkinstall还支持创建其他类型的软件包,例如RPM。

另请参见http://community.linuxmint.com/tutorial/view/162一些基本的checkinstall用法以及debian checkinstall软件包


*:如果您在安装后阅读本手册,make install仍然可以按照上述说明进行操作,然后进行后续操作dpkg -r $PACKAGE_NAME_YOU_CHOSEN


53
这个答案证明最好的答案通常得不到很多支持。谢谢!我一直想知道如何做到这一点。我总是会犹豫执行“ make install”,因为我知道删除它几乎肯定会很痛苦。
doug65536

1
LFS书籍还提供了有关软件包管理系统的一些信息,因为您必须自己进行设置。那里的信息应该有助于使这种事情更好地工作(更清洁,更通用)。有些脚本仅侦听安装的内容,然后创建一个脚本,该脚本在启动时会删除所有这些文件或类似的文件。
Nisse

13
即使我已经make install在使用它之前就已经跑步了,这对我来说还是很checkinstall不错的。
LukeGT 2014年

9
安装软件包,checkinstall以便获得出色的答案。
quimnuss

1
与用户“ LukeGT”评论的类似,如果安装配置文件不可用,但安装程序文件可用,则可以使用它们进行编译和安装,checkinstall并且如果使用与旧版本相同的设置进行新编译,则卸载已安装的软件包。与checkinstall应该删除以前安装的文件。
爱德华

62

如果您有一个manifest列出所有已安装文件的文件,则make install可以运行此命令,该命令来自另一个答案:

cat install_manifest.txt | xargs echo rm | sh

如果有sudo make install,则需要在卸载中添加一个sudo:

cat install_manifest.txt | xargs echo sudo rm | sh

4
我很惊讶地看到这没有任何支持。当没有其他选项起作用时,这可以从系统中删除文件。就我而言,checkinstall无法创建deb,因为该程序的版本不是以数字开头,因此无法生成。这很好。
DWils 2014年

3
@DWils我认为它没有收到更多赞誉,因为它非常危险。此外,xargs echo rm | sh?很明显,无论是谁建议的,在使用shell方面不是特别有经验或知识。
2014年

4
(作为参考,它将对由shell解释的文件名中的任何字符进行反驳(然后您将执行流氓'rm'!),此外,它将进行各种shell扩展。请想象一下如果install_manifest.txt包含星号会发生什么情况... rm *将通过管道传送到外壳中。)
2014年

@fstd非常正确。像往常一样,必须仔细使用这种答案。在运行此命令之前,请检查清单文件。但是,如果您使用的是外壳,我想您知道自己在做什么。

您能描述一个install_manifest.txt预期存在的情况吗?
einpoklum

28

取决于所讨论程序的makefile / configure脚本/ autofoo魔术程度,以下内容可能会解决您的问题:

make uninstall

问题是您应该在已安装版本的源代码树上执行此操作,并使用与安装时使用的配置完全相同的配置。


19

“进行安装”后如何卸载

方法1(进行卸载)

步骤1:仅当您以任何方式删除/更改了构建目录时,才需要执行此步骤:使用完全相同的地址下载并进行/进行安装过程。

步骤2:尝试进行卸载。

cd $SOURCE_DIR 
sudo make uninstall

如果成功,那么您就完成了。如果您偏执狂,也可以尝试“方法#3”中的步骤,以确保make uninstall没有丢失任何文件。

方法2(checkinstall-仅适用于基于debian的系统)

过程概述

在基于debian的系统(例如Ubuntu)中,您可以.deb使用名为的工具轻松地创建软件包checkinstall。然后,您安装.deb软件包(这将使您的debian系统意识到软件包的所有部分均已安装),最后将其卸载以使软件包管理器正确清理系统。

一步步

sudo apt-get -y install checkinstall
cd $SOURCE_DIR 
sudo checkinstall

此时checkinstall将提示输入软件包名称。输入一些描述性的内容并加以注意,因为您将在一分钟内使用它。它还会提示您一些其他可以忽略的数据。如果它抱怨该版本不可接受,请输入合理的内容,例如1.0。完成后,您可以安装并最终卸载:

sudo dpkg -i $PACKAGE_NAME_YOU_ENTERED 
sudo dpkg -r $PACKAGE_NAME_YOU_ENTERED

方法3(install_manifest.txt)

如果install_manifest.txt源目录中存在文件,则该文件应包含安装创建的每个文件的文件名。

因此,首先检查文件列表及其修改时间:

cd $SOURCE_DIR 
sudo xargs -I{} stat -c "%z %n" "{}" < install_manifest.txt

您应该得到零错误,并且列出的文件的mod-times应该在安装时间上或之后。如果一切正常,则可以将其删除:

cd $SOURCE_DIR 
mkdir deleted-by-uninstall
sudo xargs -I{} mv -t deleted-by-uninstall "{}" < install_manifest.txt

但是,用户Merlyn Morgan-Graham对这种方法有一个严重的提醒,请牢记(逐字复制在此处):“当心其他软件包也可能已安装的文件。只需删除这些文件,即可[...]打破其他包裹。” 。这就是我们创建deleted-by-uninstall目录并将文件移到那里而不是删除它们的原因。


该帖子的99%存在于其他答案中。我只是(希望)轻松地收集了所有有用的方法,并试图特别注意重要的细节(例如,引用xarg参数并保留已删除文件的备份)。


方法2对我有用!
Aizzaac

10

make clean 通常只清除包含源代码本身的目录中的已构建文件,而很少接触任何已安装的软件。

Makefile通常不包含卸载目标-通常,您必须自己完成操作,方法是从安装文件的目录中删除文件。例如,如果你建立了一个程序和(使用安装了它make install)进入/usr/local,你会想通过看/usr/local/bin/usr/local/libexec/usr/local/share/man,等,并删除不需要的文件。有时Makefile包含uninstall目标,但并非总是如此。

当然,通常在Linux系统上,您可以使用软件包管理器来安装软件,该软件包管理器能够“自动”卸载软件。


8

“ stow”实用程序旨在解决此问题:http : //www.gnu.org/software/stow/


5
人们将如何使用它stow来解决这一问题?
3D1T0R

存放实用程序鼓励您将每个版本安装到单独的位置,以便可以在同一台计算机上管理多个版本。如果执行此操作,则卸载就像删除整个安装目录一样简单。
布鲁斯·亚当斯

6

不幸的是,没有标准,这是从源代码安装的风险之一。一些Makefile会包含“卸载”,因此

make uninstall

从源目录中可能有效。否则,可能需要手动撤消所有操作make install

make clean 通常只清理源目录-删除生成/编译的文件等,可能不是您想要的。


0

我知道很少有支持“进行卸载”的软件包,但更多支持阶段安装的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

尽可能使用dpkg。

我也在这里发布了答案


0

Make可以告诉您它知道什么以及它将做什么。假设您有一个“安装”目标,该目标执行以下命令:

cp <filelist> <destdir>/

在通用规则中,添加:

uninstall :; MAKEFLAGS= ${MAKE} -j1 -spinf $(word 1,${MAKEFILE_LIST}) install \
              | awk '/^cp /{dest=$NF; for (i=NF; --i>0;) {print dest"/"$i}}' \
              | xargs rm -f

一个类似的技巧可以做一个通用的make clean


0

前言

下面的内容可能会起作用,也可能不会起作用,这一切都是照原样提供的,在某些损坏,数据丢失等情况下,您和您仅是负责人。但我希望一切顺利!

要撤消,make install我会(而且我确实)这样做了:

想法:检查安装的脚本,然后使用简单的bash脚本撤消该操作。

  1. 重新配置您的构建目录以安装到某些自定义目录。我通常这样做:--prefix=$PWD/install。对于CMake,您可以转到构建目录,打开CMakeCache.txt,并修复CMAKE_INSTALL_PREFIX值。
  2. 将项目安装到自定义目录(make install再次运行)。
  3. 现在我们从假设出发,该make install脚本将与您要从其他地方删除的相同内容(通常是/usr/local)安装到自定义目录中。因此,我们需要一个脚本。3.1。脚本应将自定义目录与要清除的目录进行比较。我用这个:

防安装

RM_DIR=$1
PRESENT_DIR=$2

echo "Remove files from $RM_DIR, which are present in $PRESENT_DIR"

pushd $RM_DIR

for fn in `find . -iname '*'`; do
#  echo "Checking $PRESENT_DIR/$fn..."
  if test -f "$PRESENT_DIR/$fn"; then
    # First try this, and check whether things go plain
    echo "rm $RM_DIR/$fn"

    # Then uncomment this, (but, check twice it works good to you).
    # rm $RM_DIR/$fn
  fi
done

popd

3.2。现在只需运行此脚本(它将空运行)

bash anti-install.sh <dir you want to clean> <custom installation dir>

例如,您将无法清理/ usr / local,并且自定义安装目录为/user/me/llvm.build/install,那么它将是

bash anti-install.sh /usr/local /user/me/llvm.build/install

3.3。仔细检查日志,如果命令对您有用,请取消注释rm $RM_DIR/$fn并再次运行。但是停下来!你真的仔细检查了吗?可能会再次检查吗?

指令来源:https : //dyatkovskiy.com/2019/11/26/anti-make-install/

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.