在跑步的时候
./configure --prefix=/mingw
在我之前运行的库的 MinGW/MSYS 系统上
'./configure --prefix=/mingw && make && make install'
我遇到了这个消息:
警告:已经安装了 Vamp 插件 SDK 的版本。如果您安装新版本而不先删除旧版本,则可能会有担忧和悲伤。 (继续)
这让我很担心。 'make install' 的反义词是什么,即如何在 Linux 中卸载库? 'make clean' 会完成这项工作,还是涉及其他步骤?
sudo make uninstall
,但如果没有其他明显的解决方案,除了使用“checkinstall”实用程序安装时使用系统包管理实用程序卸载。
make install
后,我不再需要 make uninstall
来删除它们。我一直用 xargs rm < install_manifest.txt
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 和 some basic checkinstall usage 和 debian checkinstall package。
*:如果您在使用 make install
安装后阅读此内容,您仍然可以按照上述说明并在之后执行 dpkg -r $PACKAGE_NAME_YOU_CHOSEN
。
checkinstall
之前已经运行了 make install
。
checkinstall
以获得这个出色的答案。
.deb
文件,而无需使用 checkinstall --install=no
实际安装它
如果您有一个 manifest
文件,其中列出了使用 make install
安装的所有文件,您可以运行我从另一个答案中获得的这个命令:
cat install_manifest.txt | xargs echo rm | sh
如果您有 sudo make install
,则需要在卸载中添加 sudo:
cat install_manifest.txt | xargs echo sudo rm | sh
xargs echo rm | sh
?很明显,提出这个建议的人在使用 shell 方面并不是特别有经验或知识渊博。
install_manifest.txt
包含一个星号... rm *
将通过管道传输到外壳中。)出于这个原因,被否决了。
install_manifest.txt
的情况?
根据相关程序的 makefile/configure script/autofoo 魔术的好坏,以下可能会解决您的问题:
make uninstall
问题是您应该在已安装版本的源代码树上执行此操作,并且使用与安装时完全相同的配置。
“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 参数和保留已删除文件的备份)。
make clean
通常只清理包含源代码本身的目录中的构建文件,很少触及任何已安装的软件。
Makefile 通常不包含卸载目标——您通常必须自己执行此操作,方法是从安装它们的目录中删除文件。例如,如果您构建了一个程序并将其(使用 make install
)安装到 /usr/local
中,则您需要查看 /usr/local/bin
、/usr/local/libexec
、/usr/local/share/man
等,并删除不需要的文件。有时 Makefile 包含一个 uninstall
目标,但并非总是如此。
当然,通常在 Linux 系统上,您使用包管理器安装软件,它能够“自动”卸载软件。
“stow”实用程序旨在解决此问题:http://www.gnu.org/software/stow/
stow
来解决这个问题?
不幸的是,没有标准,这是从源代码安装的危险之一。一些 Makefile 将包含“卸载”,所以
make uninstall
从源目录可能会起作用。否则,可能需要手动撤消 make install
所做的任何事情。
make clean
通常只是清理源目录 - 删除生成/编译的文件等,可能不是您想要的。
制作
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,其中涵盖了整个过程并进行了解释。
方法一
从源文件夹:
#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)
您可以使用上述任何一种方法来做到这一点。
我知道支持“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的答案
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
。
前言
以下可能有效,也可能无效,这一切都是按原样提供的,如果发生某些损坏、数据丢失等,您和只有您是负责人。但我希望一切顺利!
要撤消 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/
祝你好运!