ChatGPT解决这个技术问题 Extra ChatGPT

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

在跑步的时候

./configure --prefix=/mingw 

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

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

我遇到了这个消息:

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

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

有关类似答案,请参阅 askubuntu.com/questions/87111/…,如果安装配置文件仍然可用,则当前的主要解决方案似乎是 sudo make uninstall,但如果没有其他明显的解决方案,除了使用“checkinstall”实用程序安装时使用系统包管理实用程序卸载。
运行 make install 后,我不再需要 make uninstall 来删除它们。我一直用 xargs rm < install_manifest.txt

P
Paweł Obrok

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

如果幸运的话,运行 make uninstall 就可以了。但是,由图书馆的作者提供。一些作者提供了一个 uninstall 目标,而另一些则没有。

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


+1;注意可能也已由其他软件包安装的文件。简单地删除这些文件(“手动反转这些步骤”的一种解释)可能会破坏其他包。这是(众多原因之一)包管理器被发明的原因。
这只有在您保持相同的配置和编译的构建目录时才有可能吗?因此不是很有用,因为大多数人会在安装后将其删除。他想卸载东西,不管他是否保留了 build 文件夹,也不管包是否为 make 卸载选项正确配置。澄清:他想要做的是对适用于他自己编译的东西的包进行某种管理。
n
ndemou

如果 sudo make uninstall 不可用:

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

另请参阅 http://community.linuxmint.com/tutorial/view/162some basic checkinstall usagedebian checkinstall package

*:如果您在使用 make install 安装后阅读此内容,您仍然可以按照上述说明并在之后执行 dpkg -r $PACKAGE_NAME_YOU_CHOSEN


这个答案证明了最好的答案通常不会得到很多赞成票。谢谢!我想知道如何做到这一点很长时间了。我总是犹豫是否要进行“make install”,因为我知道删除它几乎肯定会很痛苦。
LFS 书也有一些关于包管理系统的信息,因为你必须自己设置它。那里的信息应该有助于让这种事情更好地工作(更干净,更通用)。有些脚本只是监听安装的内容,然后创建一个脚本,该脚本在启动时会删除所有这些文件,或类似的东西。
这对我来说效果很好,即使我在使用 checkinstall 之前已经运行了 make install
安装包 checkinstall 以获得这个出色的答案。
您可以生成一个 .deb 文件,而无需使用 checkinstall --install=no 实际安装它
t
three

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

cat install_manifest.txt | xargs echo rm | sh

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

cat install_manifest.txt | xargs echo sudo rm | sh

我很惊讶地看到这没有得到任何支持。当没有其他选项起作用时,这可以从系统中删除文件。就我而言, checkinstall 无法创建 deb,因为程序的版本没有以数字开头,因此不会构建。这很好用。
@DWils 我认为它没有收到更多的赞成票,因为它非常危险。此外,xargs echo rm | sh?很明显,提出这个建议的人在使用 shell 方面并不是特别有经验或知识渊博。
(作为参考,它会在文件名中由 shell 解释的任何字符(然后你有流氓 'rm 正在执行!),此外它还会进行各种 shell 扩展。想象一下如果 install_manifest.txt包含一个星号... rm * 将通过管道传输到外壳中。)出于这个原因,被否决了。
@fstd 非常正确。像往常一样,这种答案必须小心使用。在运行此命令之前检查清单文件。但是,如果您使用的是 shell,我假设您知道自己在做什么。
您能否描述可以预期存在 install_manifest.txt 的情况?
J
Joachim Sauer

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

make uninstall

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


a
agc

“make install”后如何卸载

方法#1(进行卸载)

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

第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 存在于您的源目录中,它应该包含安装创建的每个文件的文件名。

所以首先检查文件列表及其修改时间:

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


m
mipadi

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

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

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


j
jjw

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


如何使用 stow 来解决这个问题?
stow 实用程序鼓励您将每个版本安装到单独的位置,以便您可以在同一台机器上管理多个版本。如果您这样做,那么卸载就像删除整个安装目录一样简单。
B
Brenton Alker

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

make uninstall

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

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


d
david-littlefield

制作

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

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

检查安装

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

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

将“source_location.deb”和“name”替换为您在 Screenshot 中的信息。

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

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

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


V
V Li

方法一

从源文件夹:

#make uninstall

方法二

如果没有卸载过程:

打开 install_manifest.txt(由#make install 创建)删除列出的所有目录/文件删除您错过的所有剩余文件:#xargs rm < install_manifest.txt 删除所有隐藏目录/文件:$rm -rf ~/.packagename

删除源文件夹。

方法三

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

#make -n install

并反转安装过程:

#rm -rf all directories/files created

例子

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

How do I completely uninstall Node.js, and reinstall from beginning (Mac OS X)

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


B
Bruce Adams

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

我还发布了这个here的答案


M
Mischa

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


S
Stepan Dyatkovskiy

前言

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

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

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

重新配置您的构建目录以安装到某个自定义目录。我通常这样做:--prefix=$PWD/install.对于 CMake,您可以转到构建目录,打开 CMakeCache.txt,并修复 CMAKE_INSTALL_PREFIX 值。将项目安装到自定义目录(只需再次运行 make install )。现在我们从假设出发,即 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/

祝你好运!