Điều gì trái ngược với 'tạo cài đặt', tức là làm thế nào để bạn gỡ cài đặt thư viện trong Linux?


396

Trong khi chạy

./configure --prefix=/mingw 

trên hệ thống MinGW / MSYS cho thư viện tôi đã chạy trước đây

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

Tôi đã xem qua tin nhắn này:

CẢNH BÁO: Phiên bản SDK plugin Vamp đã được cài đặt. Mong đợi những lo lắng và buồn phiền nếu bạn cài đặt một phiên bản mới mà không loại bỏ phiên bản cũ trước. (Tiếp tục)

Điều này đã làm tôi lo lắng. Điều gì trái ngược với 'make install', tức là thư viện được gỡ cài đặt trong Linux như thế nào? 'Làm sạch' sẽ thực hiện công việc, hoặc có các bước khác liên quan?



1
Xem Askubfox.com/questions/87111/ để có câu trả lời tương tự, giải pháp chính hiện có vẻ là sudo make uninstallnếu các tệp cấu hình cài đặt vẫn có sẵn nhưng không có giải pháp rõ ràng nào khác nếu không, ngoài việc gỡ cài đặt với tiện ích quản lý gói hệ thống nếu được cài đặt bằng "checkinstall "Tiện ích.
Edward

7
Sau khi chạy make installtôi không bao giờ cần make uninstallphải loại bỏ chúng. Tôi đã luôn sử dụngxargs rm < install_manifest.txt
John Strood

Câu trả lời:


508

make cleanxóa mọi tệp trung gian hoặc đầu ra khỏi cây nguồn / bản dựng của bạn. Tuy nhiên, nó chỉ ảnh hưởng đến cây nguồn / xây dựng; nó không chạm vào phần còn lại của hệ thống tập tin và do đó sẽ không xóa phần mềm đã cài đặt trước đó.

Nếu bạn may mắn, chạy make uninstallsẽ hoạt động. Tuy nhiên, tùy thuộc vào các tác giả của thư viện để cung cấp điều đó; một số tác giả cung cấp một uninstallmục tiêu, những người khác thì không.

Nếu bạn không may mắn, bạn sẽ phải gỡ cài đặt thủ công. Chạy make -n installcó thể hữu ích, vì nó sẽ hiển thị các bước mà phần mềm sẽ tự cài đặt nhưng thực tế sẽ không làm gì cả. Sau đó, bạn có thể tự đảo ngược các bước đó.


10
+1; Coi chừng các tập tin cũng có thể đã được cài đặt bởi các gói khác. Chỉ cần xóa các tệp này (một cách giải thích "đảo ngược các bước đó theo cách thủ công") có thể phá vỡ các gói khác. Đây là (một trong nhiều lý do) tại sao các nhà quản lý gói được phát minh.
Merlyn Morgan-Graham

3
Điều này chỉ có thể nếu bạn giữ cùng một thư mục xây dựng được cấu hình và biên dịch đúng không? do đó không hữu ích lắm vì hầu hết mọi người sẽ xóa nó sau khi cài đặt. Anh ta muốn gỡ cài đặt mọi thứ bất kể anh ta có giữ thư mục bản dựng hay không và bất kể gói đó có được cấu hình đúng cho tùy chọn gỡ cài đặt hay không. Làm rõ: những gì anh ta muốn làm là cho phép một số loại quản lý cho các gói hoạt động cho những thứ anh ta tự biên soạn.
Nisse

360

Nếu sudo make uninstallkhông có sẵn:

Trong hệ thống dựa trên Debian, thay vì (hoặc sau *), make installbạn có thể chạy sudo checkinstallđể tạo một .debtệp được cài đặt tự động. Sau đó, bạn có thể xóa nó bằng trình quản lý gói hệ thống (ví dụ apt/ synaptic/ aptitude/ dpkg). Checkinstall cũng hỗ trợ tạo các loại gói khác, ví dụ RPM.

Xem thêm http://community.linuxmint.com/tutorial/view/162một số gói sử dụng cài đặt kiểm tra cơ bảngói cài đặt debian .


*: Nếu bạn đang đọc bài này sau khi cài đặt xong, make installbạn vẫn có thể làm theo các hướng dẫn ở trên và thực hiện dpkg -r $PACKAGE_NAME_YOU_CHOSENsau đó.


53
Câu trả lời này là bằng chứng cho thấy những câu trả lời hay nhất thường không nhận được nhiều phiếu bầu. Cảm ơn! Tôi đã muốn biết làm thế nào để làm điều này trong một thời gian dài. Tôi luôn do dự khi thực hiện "cài đặt" bởi vì tôi biết nó gần như chắc chắn sẽ là một nỗi đau để loại bỏ.
doug65536

1
Ngoài ra, cuốn sách LFS có một số thông tin về các hệ thống quản lý gói, vì bạn phải tự thiết lập nó. Thông tin ở đó sẽ hữu ích trong việc làm cho loại điều này hoạt động tốt hơn (sạch hơn, tổng quát hơn). Có những tập lệnh chỉ đơn giản là nghe những gì được cài đặt và sau đó tạo ra một tập lệnh mà khi khởi chạy sẽ xóa tất cả các tập tin đó, hoặc một cái gì đó tương tự.
Nisse

13
Điều này làm việc rất tốt cho tôi, mặc dù tôi đã chạy make installtrước khi sử dụng checkinstallthay thế.
LukeGT

9
Cài đặt gói checkinstallcho câu trả lời tuyệt vời này để làm việc.
quimnuss 30/03/2016

1
Tương tự như những gì người dùng "LukeGT" đã nhận xét, nếu các tệp cấu hình cài đặt không có sẵn nhưng các tệp cài đặt thì chúng có thể được biên dịch và cài đặt checkinstallvà nếu quá trình biên dịch mới được thực hiện với cùng cài đặt như cài đặt cũ, hãy gỡ cài đặt gói đã cài đặt với checkinstallnên loại bỏ các tập tin được cài đặt trước đó.
Edward

62

Nếu bạn có một manifesttệp liệt kê tất cả các tệp đã được cài đặt, make installbạn có thể chạy lệnh này mà tôi có từ một câu trả lời khác:

cat install_manifest.txt | xargs echo rm | sh

Nếu bạn có, sudo make installbạn sẽ cần thêm sudo để gỡ cài đặt:

cat install_manifest.txt | xargs echo sudo rm | sh

4
Tôi ngạc nhiên khi thấy điều này đã không nhận được bất kỳ sự ủng hộ nào. Điều này làm việc để loại bỏ các tập tin khỏi hệ thống khi không có tùy chọn khác làm việc. Trong trường hợp của tôi, checkinstall không thể tạo ra một cuộc tranh luận vì phiên bản của chương trình không bắt đầu bằng một số và do đó sẽ không được xây dựng. Điều này làm việc độc đáo.
DWils

3
@DWils Tôi nghĩ rằng nó đã không nhận được nhiều lượt upvote hơn vì nó khá nguy hiểm. Ngoài ra , xargs echo rm | sh? Rõ ràng là bất cứ ai đề nghị điều này không đặc biệt có kinh nghiệm hoặc hiểu biết trong việc sử dụng vỏ.
fstd

4
(để tham khảo, nó sẽ barf trên bất kỳ ký tự trong tên tập tin được giải thích bằng vỏ (và sau đó bạn có bất hảo 'rm của được thực hiện!), ngoài ra nó sẽ làm tất cả các loại mở rộng vỏ. Chỉ cần tưởng tượng những gì sẽ xảy ra nếu install_manifest.txtcó chứa một dấu hoa thị ... rm *sẽ được dẫn vào một cái vỏ.) Vì lý do này.
fstd

@fstd hoàn toàn đúng. Như thường lệ, loại câu trả lời này phải được sử dụng cẩn thận. Kiểm tra tệp kê khai trước khi bạn chạy lệnh này. Nhưng nếu bạn đang sử dụng shell thì tôi cho rằng bạn biết bạn đang làm gì.
ba

Bạn có thể mô tả các trường hợp theo đó một install_manifest.txtdự kiến ​​có thể tồn tại?
einpoklum

28

Tùy thuộc vào mức độ ma thuật makefile / configure script / autofoo của chương trình được đề cập là điều sau đây có thể giải quyết vấn đề của bạn:

make uninstall

Vấn đề là bạn nên thực thi điều này trên cây nguồn của phiên bản bạn đã cài đặt và với cùng cấu hình chính xác mà bạn đã sử dụng để cài đặt.


19

Cách gỡ cài đặt sau khi "thực hiện cài đặt"

Phương pháp # 1 (thực hiện gỡ cài đặt)

Bước 1: Bạn chỉ cần làm theo bước này nếu bạn đã xóa / thay đổi thư mục bản dựng theo bất kỳ cách nào: Tải xuống và thực hiện / thực hiện cài đặt bằng cách sử dụng chính xác quy trình như bạn đã làm trước đây.

Bước 2: thử thực hiện gỡ cài đặt.

cd $SOURCE_DIR 
sudo make uninstall

Nếu điều này thành công, bạn đã hoàn thành. Nếu bạn bị hoang tưởng, bạn cũng có thể thử các bước của "Phương pháp số 3" để đảm bảo make uninstallkhông bỏ sót bất kỳ tệp nào.

Phương pháp # 2 (kiểm tra cài đặt - chỉ dành cho các hệ thống dựa trên debian)

Tổng quan về quy trình

Trong các hệ thống dựa trên debian (ví dụ Ubuntu), bạn có thể tạo một .debgói rất dễ dàng bằng cách sử dụng một công cụ có tên checkinstall. Sau đó, bạn cài đặt gói .deb (điều này sẽ khiến hệ thống debian của bạn nhận ra rằng tất cả các phần trong gói của bạn đã thực sự được cài đặt) và cuối cùng gỡ cài đặt nó để cho phép trình quản lý gói của bạn dọn sạch hệ thống của bạn.

Từng bước một

sudo apt-get -y install checkinstall
cd $SOURCE_DIR 
sudo checkinstall

Tại thời điểm checkinstallnày sẽ nhắc cho một tên gói. Nhập một cái gì đó mô tả một chút và lưu ý nó bởi vì bạn sẽ sử dụng nó trong một phút. Nó cũng sẽ nhắc thêm một vài dữ liệu mà bạn có thể bỏ qua. Nếu nó phàn nàn về phiên bản không được chấp nhận, chỉ cần nhập một cái gì đó hợp lý như thế nào 1.0. Khi hoàn tất, bạn có thể cài đặt và cuối cùng gỡ cài đặt:

sudo dpkg -i $PACKAGE_NAME_YOU_ENTERED 
sudo dpkg -r $PACKAGE_NAME_YOU_ENTERED

Phương pháp # 3 (install_manifest.txt)

Nếu một tệp install_manifest.txttồn tại trong thư mục nguồn của bạn, nó sẽ chứa tên tệp của mỗi tệp mà cài đặt đã tạo.

Vì vậy, trước tiên hãy kiểm tra danh sách các tập tin và thời gian mod của chúng:

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

Bạn sẽ không nhận được lỗi nào và thời gian sửa đổi của các tệp được liệt kê sẽ bật hoặc sau thời gian cài đặt. Nếu tất cả đều ổn, bạn có thể xóa chúng trong một lần:

cd $SOURCE_DIR 
mkdir deleted-by-uninstall
sudo xargs -I{} mv -t deleted-by-uninstall "{}" < install_manifest.txt

Tuy nhiên, người dùng Merlyn Morgan-Graham có một thông báo nghiêm túc về phương pháp này mà bạn nên ghi nhớ (sao chép nguyên văn ở đây): "Coi chừng các tệp cũng có thể đã được cài đặt bởi các gói khác. Chỉ cần xóa các tệp này [...] có thể phá vỡ các gói khác. " . Đó là lý do mà chúng tôi đã tạo deleted-by-uninstallthư mục và di chuyển các tệp ở đó thay vì xóa chúng.


99% bài viết này tồn tại trong các câu trả lời khác. Tôi chỉ thu thập mọi thứ hữu ích theo cách dễ dàng (hy vọng) để làm theo và cố gắng chú ý thêm vào các chi tiết quan trọng (như trích dẫn các đối số xarg và giữ các bản sao lưu của các tệp đã bị xóa).


PHƯƠNG PHÁP 2 làm việc cho tôi!
Aeatherac

10

make clean thường chỉ xóa các tệp được xây dựng trong thư mục chứa chính mã nguồn và hiếm khi chạm vào bất kỳ phần mềm đã cài đặt nào.

Makefiles thường không chứa mục tiêu để gỡ cài đặt - bạn thường phải tự làm điều đó bằng cách xóa các tệp khỏi thư mục mà chúng được cài đặt. Ví dụ, nếu bạn xây dựng một chương trình và cài đặt nó (sử dụng make install) vào /usr/local, bạn sẽ muốn xem xét thông qua /usr/local/bin, /usr/local/libexec, /usr/local/share/man, vv, và loại bỏ các tập tin không mong muốn. Đôi khi một Makefile bao gồm một uninstallmục tiêu, nhưng không phải lúc nào cũng vậy.

Tất nhiên, thông thường trên hệ thống Linux, bạn cài đặt phần mềm bằng trình quản lý gói , có khả năng gỡ cài đặt phần mềm "tự động".


8

Tiện ích "stow" được thiết kế để giải quyết vấn đề này: http://www.gnu.org/software/stow/


5
Làm thế nào một người sẽ đi về sử dụng stowđể giải quyết vấn đề này?
3D1T0R

Tiện ích stow khuyến khích bạn cài đặt từng phiên bản vào một vị trí riêng biệt để bạn có thể quản lý nhiều phiên bản trên cùng một máy. Nếu bạn làm điều này thì việc gỡ cài đặt có thể đơn giản như xóa toàn bộ thư mục cài đặt.
Bruce Adams

6

Thật không may, không có tiêu chuẩn, đây là một trong những nguy cơ của việc cài đặt từ nguồn. Một số Makefiles sẽ bao gồm "gỡ cài đặt", vì vậy

make uninstall

từ thư mục nguồn có thể hoạt động. Mặt khác, nó có thể là một vấn đề hoàn tác thủ công bất cứ điều gì make installđã làm.

make clean thường chỉ cần dọn sạch thư mục nguồn - loại bỏ các tệp được tạo / biên dịch và tương tự, có thể không phải là những gì bạn đang theo đuổi.


0

Tôi biết một vài gói hỗ trợ "thực hiện gỡ cài đặt" nhưng nhiều gói khác hỗ trợ cài đặt DESTDIR = xxx "cho các cài đặt theo giai đoạn.

Bạn có thể sử dụng điều này để tạo một gói mà bạn cài đặt thay vì cài đặt trực tiếp từ nguồn. Tôi không có may mắn với checkinstall nhưng fpm hoạt động rất tốt.

Điều này cũng có thể giúp bạn loại bỏ một gói được cài đặt trước đó bằng cách sử dụng make install . Bạn chỉ cần buộc cài đặt gói đã xây dựng của bạn qua gói đã cài đặt và sau đó gỡ cài đặt gói đó.

Ví dụ, tôi đã sử dụng điều này gần đây để đối phó với protobuf-3.3.0. Trên 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      

Thích yum đến vòng / phút nếu bạn có thể.

Trên 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

Thích apt để dpkg nơi bạn có thể.

Tôi cũng đã đăng câu trả lời này ở đây


0

Makecó thể cho bạn biết những gì nó biết và những gì nó sẽ làm. Giả sử bạn có một mục tiêu "cài đặt", thực thi các lệnh như:

cp <filelist> <destdir>/

Trong quy tắc chung của bạn, thêm:

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

Một mẹo tương tự có thể làm một chung chung make clean.


0

Lời nói đầu

bên dưới có thể hoạt động hoặc có thể không, đây là tất cả những gì được đưa ra, bạn và chỉ bạn là người chịu trách nhiệm trong trường hợp có một số thiệt hại, mất dữ liệu và như vậy. Nhưng tôi hy vọng mọi thứ diễn ra suôn sẻ!

Để hoàn tác make installtôi sẽ làm (và tôi đã làm) điều này:

Ý tưởng: kiểm tra bất kỳ tập lệnh nào cài đặt và hoàn tác điều này với tập lệnh bash đơn giản.

  1. Cấu hình lại dir xây dựng của bạn để cài đặt vào một số dir tùy chỉnh. Tôi thường làm điều này : --prefix=$PWD/install. Đối với CMake, bạn có thể truy cập thư mục xây dựng của mình, mở CMakeCache.txt và sửa giá trị CMAKE_INSTALL_PREFIX.
  2. Cài đặt dự án vào thư mục tùy chỉnh (chỉ cần chạy make installlại).
  3. Bây giờ chúng tôi đẩy từ giả định, make installtập lệnh đó cài đặt vào thư mục tùy chỉnh giống như nội dung bạn muốn xóa từ một nơi khác (thông thường /usr/local). Vì vậy, chúng tôi cần một kịch bản. 3.1. Script nên so sánh dir tùy chỉnh, với dir bạn muốn sạch. Tôi sử dụng cái này:

chống cài đặt.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. Bây giờ chỉ cần chạy tập lệnh này (nó sẽ chạy khô)

bash anti-install.sh <dir you want to clean> <custom installation dir>

Ví dụ: Bạn sẽ không dọn dẹp / usr / local và thư mục cài đặt tùy chỉnh của bạn là /user/me/llvm.build/install, sau đó sẽ là

bash anti-install.sh /usr/local /user/me/llvm.build/install

3.3. Kiểm tra nhật ký cẩn thận, nếu các lệnh tốt cho bạn, bỏ ghi chú rm $RM_DIR/$fnvà chạy lại nó. Nhưng dừng lại! Bạn đã thực sự kiểm tra cẩn thận? Có thể được kiểm tra lại?

Nguồn để hướng dẫn: https://dyatkovskiy.com/2019/11/26/anti-make-install/

Chúc may mắn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.