มันเป็นไรหรือไม่ที่จะเชื่อมโยงไลบรารีเพื่อเอาชนะข้อผิดพลาด“ ไม่สามารถเปิดวัตถุที่ใช้ร่วมกัน” ได้?


12

บางครั้งด้วยเหตุผลใดก็ตามโปรแกรมไม่ได้ระบุหรือรวมการขึ้นต่อกันทั้งหมดอย่างถูกต้องและการเริ่มการทำงานนั้นจะส่งผลให้เกิดข้อผิดพลาดที่บ่งบอกถึงการขึ้นต่อกันที่หายไป ข้อผิดพลาดทั่วไปคือสิ่งที่ชอบ:

cannot open shared object libudev.so.0

ฉันเห็นคำตอบมากมายที่แนะนำให้ผู้ใช้แก้ไขปัญหาดังกล่าวด้วยการทำ symlink ใน/usr/libหรือที่ตั้งของระบบอื่น ๆ และสิ่งนี้ดูเหมือนจะแก้ปัญหาได้บ่อยครั้ง แต่ฉันเห็นความคิดเห็นจำนวนเท่ากันที่แนะนำผู้คนว่ามันเป็นความคิดที่ไม่ดี นี่คือหนึ่งคำตอบที่เป็นตัวแทน

ภายใต้สถานการณ์ที่ยอมรับ symlink ไลบรารีเพื่อให้โปรแกรมทำงานภายใต้สถานการณ์ใด ไม่เคย? บางครั้ง? ถ้าคุณลบ symlink หลังจากที่คุณรันโปรแกรมเสร็จแล้ว

อะไรคือผลของการทำเช่นนี้?

คำตอบ:


12

ปัญหาของการสร้างลิงค์เหล่านี้คือพวกมันไม่ได้ถูกจัดการอย่างมีความหมาย หากลบไลบรารีนั้นลิงก์นั้นจะเสียหาย หากอัปเกรดไลบรารีแล้วอาจพบข้อผิดพลาดเนื่องจากลิงก์ที่ไม่คาดว่าจะมี

นอกจากนี้คุณยังโกหกระบบ ในตัวอย่างที่เชื่อมโยงคุณจะแสร้งทำเป็นว่าเป็นจริงlibudev.so.1 libudev.so.0พวกเขาถูกตั้งชื่อแตกต่างกันด้วยเหตุผล (เวอร์ชันที่แตกต่างกันของห้องสมุด) ขณะนี้อาจทำงานได้ดีสำหรับบางโปรแกรมมีความเป็นไปได้ที่ความแตกต่างระหว่างเวอร์ชันอาจทำให้เกิดปัญหา (เช่น segfault หรือพฤติกรรมที่ไม่คาดคิดอื่น ๆ )

ดังนั้นหากคุณกำลังสร้างลิงค์นี้โดยเฉพาะเพื่อให้โปรแกรมทำงานและคุณรู้ว่าคุณจะลบมันในภายหลังคุณจะต้องจัดการกับปัญหาแรก แต่ไม่ใช่ปัญหาที่สอง แม้ว่าสิ่งนี้จะจัดการกับปัญหาหลัก แต่ก็ไม่เหมาะ

ทางออกที่ดีที่สุดคือการติดตั้งไลบรารี่ที่ถูกต้อง (คำตอบที่ได้รับการยอมรับในตัวอย่างที่เชื่อมโยงของคุณ) หรือเพื่อคอมไพล์โปรแกรมกับเวอร์ชั่นที่คุณมี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.