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

时间:2009-09-17 16:37:06

标签: makefile uninstall

跑步时

./configure --prefix=/mingw 
在我以前运行的库的MinGW / MSYS系统上

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

我看到了这条消息:

  

警告:已安装Vamp插件SDK的一个版本。如果您安装新版本而不先删除旧版本,则会出现忧虑和悲伤。 (继续)

这让我很担心。与'make install'相反的是什么,即如何在Linux中卸载库? “干净”是否可以完成工作,还是涉及其他步骤?

13 个答案:

答案 0 :(得分:470)

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

如果你很幸运,运行make uninstall会有效。然而,这取决于图书馆的作者提供的内容;有些作者提供了uninstall目标,有些则没有。

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

答案 1 :(得分:326)

如果sudo make uninstall不可用:

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

另请参阅http://community.linuxmint.com/tutorial/view/162some basic checkinstall usage以及debian checkinstall package


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

答案 2 :(得分:55)

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

cat install_manifest.txt | xargs echo rm | sh

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

cat install_manifest.txt | xargs echo sudo rm | sh

答案 3 :(得分:24)

根据所讨论程序的makefile / configure脚本/ autofoo魔法的不同程度,以下内容可能会解决您的问题:

make uninstall

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

答案 4 :(得分:12)

如何在“make install”

之后卸载

方法#1(make uninstall)

第1步:如果您以任何方式删除/更改了构建目录,则只需执行此步骤:使用完全下载并make / make install和以前一样的程序。

第2步:尝试make uninstall。

cd $SOURCE_DIR 
sudo make uninstall

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

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

流程概述

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

一步一步

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

答案 5 :(得分:10)

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

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

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

答案 6 :(得分:7)

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

答案 7 :(得分:5)

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

make uninstall
源目录中的

可能有效。否则,可能需要手动撤消make install所做的任何事情。

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

答案 8 :(得分:3)

制作

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

Make Install命令将已编译的程序和程序包复制到库目录和makefile中的指定位置。这些地点 可能会根据配置脚本执行的检查而有所不同。

CheckInstall

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

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

Screenshot中的信息替换“ source_location.deb”和“名称”。

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

  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

这是我写的文章article,其中包含解释的整个过程。

答案 9 :(得分: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:

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

您可以使用上述任何一种方法。

答案 10 :(得分: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。

我还发布了对此here

的答案

答案 11 :(得分: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

答案 12 :(得分:0)

序言

下面的

可能有效或无效,所有内容均按原样提供,在某些损坏,数据丢失等情况下,您和您仅是负责人。但我希望一切顺利!

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

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

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

anti-install.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/

祝你好运!