448

在跑步的时候

./configure --prefix=/mingw 

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

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

我遇到了这个消息:

警告:已经安装了 Vamp 插件 SDK 的版本。如果您安装新版本而不先删除旧版本,则可能会有担忧和悲伤。(继续)

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

4

13 回答 13

555

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

如果幸运的话,跑步make uninstall会奏效。但是,由图书馆的作者提供。有些作者提供了一个uninstall目标,有些则没有。

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

于 2009-09-17T16:43:07.737 回答
406

如果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

于 2013-01-25T06:07:24.087 回答
75

如果您有一个manifest列出所有已安装文件的文件,则make install可以运行我从另一个答案中获得的命令:

cat install_manifest.txt | xargs echo rm | sh

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

cat install_manifest.txt | xargs echo sudo rm | sh
于 2014-01-13T07:45:48.837 回答
34

根据相关程序的 makefile/configure script/autofoo 魔术的好坏,以下可能会解决您的问题:

make uninstall

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

于 2009-09-17T16:39:15.770 回答
34

“make install”后如何卸载

方法#1(进行卸载)

第 1 步:如果您以任何方式删除/更改了构建目录,则只需要执行此步骤:使用与之前完全相同的过程下载和 make/make 安装。

第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

您应该得到零错误,并且列出的文件的修改时间应该在安装时间之后或之后。如果一切正常,您可以一次性删除它们:

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

于 2018-06-17T17:16:57.227 回答
11

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

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

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

于 2009-09-17T16:40:46.027 回答
9

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

于 2013-08-04T17:54:04.077 回答
6

不幸的是,没有标准,这是从源代码安装的危险之一。一些 Makefile 将包含“卸载”,所以

make uninstall

从源目录可能会起作用。否则,可能需要手动撤消所做的任何make install事情。

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

于 2009-09-17T16:41:25.247 回答
3

制作

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

Make Install 命令将构建的程序和包复制到库目录和 makefile 中的指定位置。这些位置可能因配置脚本执行的检查而异。

检查安装

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

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

用屏幕截图中的信息替换“source_location.deb”和“name”

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

  1. 安装检查安装sudo apt-get install checkinstall
  2. 运行配置脚本sudo ./configure
  3. 运行制作命令sudo make
  4. 运行检查安装sudo checkinstall
  5. 重新安装包sudo dpkg --install --force-overwrite source_location.deb
  6. 取出包装sudo apt remove name

这是我写的一篇文章,涵盖了整个过程并进行了解释。

于 2020-09-30T04:25:17.307 回答
1

方法一

从源文件夹:

#make uninstall

方法二

如果没有卸载过程:

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

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

  3. 删除您错过的所有剩余文件:

    #xargs rm < install_manifest.txt

  4. 删除任何隐藏的目录/文件:

    $rm -rf ~/.packagename

删除源文件夹。

方法三

如果以上选项都不起作用,请查看安装过程:

#make -n install

并反转安装过程:

#rm -rf all directories/files created

例子

例如,这是从源代码卸载 nodejs、npm 和 nvm 的方法:

如何完全卸载 Node.js,然后从头重新安装(Mac OS X)

您可以使用上述任何一种方法来做到这一点。

于 2021-03-19T05:43:25.043 回答
0

我知道支持“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 。

我也在这里发布了答案

于 2019-02-27T15:48:53.210 回答
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.

于 2019-05-05T19:43:08.293 回答
0

前言

以下可能有效,也可能无效,这一切都是按原样提供的,如果发生某些损坏、数据丢失等,您和只有您是负责人。但我希望一切顺利!

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

想法:检查安装的任何脚本并使用简单的 bash 脚本撤消此操作。

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

反安装.sh

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/

祝你好运!

于 2019-11-26T14:45:23.970 回答