与'make install'相反的是什么,即如何在Linux中卸载一个库?

在运行

./configure --prefix=/mingw

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

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

我看到了这条信息:

警告:Vamp插件SDK的一个版本已经安装。如果您安装了新版本而没有先删除旧版本,那么您将会感到担忧和痛苦。(继续)

这让我很担心。“make install”的反义词是什么,即如何在Linux中卸载库?“清洁”能起作用吗,或者还有其他步骤吗?

410492 次浏览

根据makefile/configure脚本/autofoo魔法的问题,下面可能会解决你的问题:

make uninstall

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

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

makefile通常不包含卸载目标——通常必须自己卸载,从安装它们的目录中删除文件。例如,如果你构建了一个程序并将它(使用make install)安装到/usr/local中,你会想要查看/usr/local/bin/usr/local/libexec/usr/local/share/man等,并删除不需要的文件。有时Makefile包含uninstall目标,但并非总是如此。

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

不幸的是,没有标准,这是从源代码安装的危险之一。一些makefile文件将包含“卸载”,因此

make uninstall

从源目录可以工作。否则,可能需要手动撤销make install所做的事情。

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

make clean从你的源/构建树中移除任何中间文件或输出文件。然而,它只影响源代码/构建树;它不会触及文件系统的其余部分,因此不会删除先前安装的软件。

如果你幸运的话,运行make uninstall可以工作。然而,这取决于图书馆的作者来提供;有些作者提供了uninstall目标,有些则没有。

如果你不幸运,你将不得不手动卸载它。运行make -n install可能会很有帮助,因为它会显示软件安装自己所采取的步骤,但实际上不会做任何事情。然后可以手动反转这些步骤。

如果sudo make uninstall不可用:

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

参见http://community.linuxmint.com/tutorial/view/162一些基本的checkinstall用法Debian checkinstall包


*:如果你是在安装了make install之后阅读这篇文章,你仍然可以按照上面的说明,然后执行dpkg -r $PACKAGE_NAME_YOU_CHOSEN

“stow”实用程序被设计来解决这个问题:http://www.gnu.org/software/stow/

如果你有一个manifest文件,它列出了所有与make install一起安装的文件,你可以运行这个命令,这是我从另一个答案:

cat install_manifest.txt | xargs echo rm | sh

如果你有sudo make install,你需要添加一个sudo到你的卸载:

cat install_manifest.txt | xargs echo sudo rm | sh

如何在“make install”后卸载

方法#1(制作卸载)

第1步:你只需要以任何方式遵循这一步如果您已经删除/修改了构建目录:使用确切的下载和make/make install的过程与之前相同。

步骤2:尝试使卸载。

cd $SOURCE_DIR
sudo make uninstall

如果此成功,您就完成了。如果你是偏执狂,你也可以尝试“方法# 3”的步骤,以确保make uninstall没有遗漏任何文件。

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

流程概述

在基于debian的系统中(例如Ubuntu),你可以通过使用名为checkinstall的工具很容易地创建.deb包。然后安装.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,它应该包含安装创建的每个文件的文件名。

所以首先检查文件列表和它们的mod-time:

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

你应该得到零错误和mod-times列出的文件应该是On或after安装时间。如果一切正常,你可以一次性删除它们:

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参数和备份已删除的文件)。

我知道很少有包支持“make uninstall”,但更多的包支持“make install DESTDIR=xxx”进行分期安装。

您可以使用它来创建一个包来安装,而不是直接从源代码安装。我没有幸运的checkinstall,但fpm工作得很好。

这也可以帮助你删除之前使用制作安装安装的包。您只需强制在make installed的包上安装您构建的包,然后卸载它。

例如,我最近使用它来处理protobuf-3.3.0。 RHEL7: < / p >
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。

我还发布了这个在这里的答案

Make可以告诉你它知道什么,它将做什么。 假设你有一个“install”目标,它执行如下命令:

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

序言

下面可能会工作,也可能不会,这都是按原样给出的,你,只有你是负责任的人,以防一些损坏,数据丢失等。但我希望一切顺利!

要撤消make install,我将这样做(我已经这样做了):

想法:检查任何脚本安装和撤销这与简单的bash脚本。

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

< em > anti-install.sh < / em >

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。构建/安装,然后就是

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/ < / p >

好运!

使

Make是用来安装从源代码编译的程序的程序。它不是Linux包管理器,所以它不会跟踪它安装的文件。这使得之后很难卸载这些文件。

Make Install命令将构建的程序和包从makefile复制到库目录和指定位置。这些位置

?

CheckInstall

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

CheckInstall命令用于调用Make Install命令。它监视已安装的文件并从中创建一个二进制包。它还使用Linux包管理器安装二进制包。

取代“source_location.deb"和“;name"与您的信息从 截图

在源包目录下执行以下命令:

  1. 安装CheckInstall sudo apt-get install checkinstall
  2. 运行配置脚本sudo ./configure
  3. 运行Make命令sudo make
  4. 执行CheckInstall sudo checkinstall
  5. 重新安装sudo dpkg --install --force-overwrite source_location.deb
  6. 删除包sudo apt remove name

这里有一篇文章文章,我写了涵盖整个过程的解释。

方法1

从源文件夹:

#make uninstall

方法2

如果没有卸载步骤:

  1. 打开install_manifest.txt(由#make install创建)

  2. 删除所有列出的目录/文件

  3. 删除您遗漏的任何剩余文件:

    #xargs rm < install_manifest.txt

  4. 删除所有隐藏目录/文件:

    $rm -rf ~/.packagename

删除源文件夹。

方法3

如果以上选项都无效,请查看安装过程:

#make -n install

并反转安装过程:

#rm -rf all directories/files created

例子

例如,这是如何从源代码卸载nodejs, npm和nvm:

我如何完全卸载Node.js,并从开始重新安装(Mac OS X) .js

你可以使用上面的任何一种方法。