Có ổn không (hoặc không) để các thư viện symlink khắc phục lỗi không thể mở được đối tượng chia sẻ đối tượng lỗi?


12

Đôi khi, vì lý do này hay lý do khác, một chương trình đã không chỉ định hoặc bao gồm tất cả các phụ thuộc của nó một cách chính xác và khởi động nó dẫn đến các lỗi chỉ ra các phụ thuộc bị thiếu. Một lỗi điển hình là:

cannot open shared object libudev.so.0

Tôi thấy rất nhiều câu trả lời khuyên mọi người /usr/libgiải quyết các vấn đề như vậy bằng cách tạo liên kết tượng trưng trong hoặc các vị trí hệ thống khác, và điều này dường như thường giải quyết vấn đề. Nhưng tôi thấy một số lượng bình luận tương đương khuyên mọi người rằng đó là một ý tưởng tồi. Đây là một câu trả lời đại diện.

Trong những trường hợp nào có thể chấp nhận liên kết một thư viện để làm cho một chương trình hoạt động? Không bao giờ? Đôi khi? Điều gì nếu bạn xóa symlink sau khi bạn chạy xong chương trình?

Hậu quả của việc này là gì?

Câu trả lời:


12

Vấn đề với việc tạo các liên kết này là chúng không được quản lý theo bất kỳ cách có ý nghĩa nào. Nếu thư viện đó bị xóa, liên kết sẽ bị hỏng. Nếu thư viện được nâng cấp, nó có thể gặp lỗi do liên kết mà nó không mong đợi ở đó.

Ngoài ra, bạn về cơ bản là nói dối với hệ thống. Trong ví dụ được liên kết, bạn đang giả vờ đó libudev.so.1là thực sự libudev.so.0. Chúng được đặt tên khác nhau vì một lý do (các phiên bản khác nhau của thư viện). Mặc dù điều này có thể chỉ hoạt động tốt đối với một số chương trình, có khả năng sự khác biệt giữa các phiên bản có thể gây ra sự cố (chẳng hạn như segfault hoặc hành vi bất ngờ khác).

Vì vậy, nếu bạn đặc biệt tạo liên kết này chỉ để một chương trình sẽ chạy và bạn biết rằng bạn sẽ xóa nó sau, bạn sẽ giải quyết vấn đề đầu tiên chứ không phải vấn đề thứ hai. Trong khi điều này không giải quyết vấn đề chính, nó không lý tưởng.

Tất nhiên, giải pháp lý tưởng là cài đặt đúng phiên bản của thư viện (câu trả lời được chấp nhận trên ví dụ được liên kết của bạn) hoặc biên dịch chương trình theo phiên bản bạn có.

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.