ที่จริงแล้วคุณสามารถติดตั้งไลบรารี่ที่แชร์ได้หลายเวอร์ชั่นถ้าทำได้ถูกต้อง
ไลบรารีที่แบ่งใช้มักจะตั้งชื่อดังนี้:
lib<name>.so.<api-version>.<minor>
ถัดไปมี symlinks ไปยังไลบรารีภายใต้ชื่อต่อไปนี้:
lib<name>.so
lib<name>.so.<api-version>
เมื่อนักพัฒนาลิงก์กับไลบรารีเพื่อสร้างไบนารี่มันเป็นชื่อไฟล์ที่ลงท้ายด้วย.soที่ linker หา อาจมีเพียงหนึ่งรายการที่ติดตั้งพร้อมกันสำหรับแต่ละรายการ<name>แต่นั่นหมายความว่านักพัฒนาซอฟต์แวร์ไม่สามารถกำหนดเป้าหมายไลบรารีหลายรุ่นในเวลาเดียวกันได้ ด้วยตัวจัดการแพคเกจ.sosymlink นี้เป็นส่วนหนึ่งของ-devแพคเกจแยกต่างหากซึ่งนักพัฒนาเท่านั้นที่จำเป็นต้องติดตั้ง
เมื่อลิงเกอร์พบไฟล์ที่มีชื่อลงท้ายด้วย.soและใช้มันมีลักษณะภายในห้องสมุดว่าสำหรับข้อมูลที่เรียกว่าsoname Soname ให้คำแนะนำแก่ linker ว่าชื่อไฟล์ใดที่จะฝังลงในไบนารี่ที่ได้และดังนั้นชื่อไฟล์ใดที่จะถูกเรียกใช้ในรันไทม์ soname lib<name>.so.<api-version>ควรจะถูกตั้งค่า
ดังนั้นเวลารันไทม์ตัวเชื่อมโยงแบบไดนามิกจะค้นหาlib<name>.so.<api-version>และใช้สิ่งนั้น
ความตั้งใจคือ:
<minor>การอัปเกรดจะไม่เปลี่ยนแปลง API ของไลบรารีและเมื่อการ<minor>ชนเข้ากับเวอร์ชันที่สูงกว่าจะปลอดภัยที่จะอนุญาตให้ไบนารีทั้งหมดอัปเกรดเป็นเวอร์ชันใหม่ เนื่องจากไบนารีทั้งหมดกำลังค้นหาไลบรารีภายใต้lib<name>.so.<api-version>ชื่อซึ่งเป็น symlink ไปยังการติดตั้งล่าสุดlib<name>.so.<api-version>.<minor>พวกเขาจะได้รับการอัพเกรด
<api-version>การอัพเกรดจะเปลี่ยน API ของไลบรารีและไม่ปลอดภัยที่จะอนุญาตให้แอปพลิเคชันไบนารีที่มีอยู่ใช้เวอร์ชันใหม่ ในกรณีที่<api-version>มีการเปลี่ยนแปลงเนื่องจากแอปพลิเคชันเหล่านั้นกำลังมองหาชื่อlib<name>.so.<api-version>แต่มีค่าแตกต่างกันสำหรับ<api-version>พวกเขาจะไม่รับรุ่นใหม่
ผู้จัดการแพคเกจมักจะไม่ทำแพ็กเกจมากกว่าหนึ่งเวอร์ชันของไลบรารีเดียวกันภายในเวอร์ชันการแจกจ่ายเดียวกันเนื่องจากการแจกจ่ายทั้งหมดรวมถึงไบนารีทั้งหมดที่ใช้ไลบรารีมักจะถูกคอมไพล์เพื่อใช้เวอร์ชันที่สอดคล้องกันของทุกไลบรารีก่อนการแจกจ่ายคือ การเผยแพร่. ตรวจสอบให้แน่ใจว่าทุกอย่างสอดคล้องกันและทุกอย่างในการแจกจ่ายนั้นเข้ากันได้กับทุกอย่างเป็นส่วนสำคัญของภาระงานสำหรับผู้จัดจำหน่าย
แต่คุณสามารถลงเอยด้วยไลบรารีหลายเวอร์ชันได้อย่างง่ายดายหากคุณอัพเกรดระบบของคุณจากการรบกวนรุ่นหนึ่งไปเป็นอีกเวอร์ชันหนึ่งและยังมีแพ็คเกจเก่าที่ต้องใช้เวอร์ชันไลบรารี่ที่เก่ากว่า ตัวอย่าง:
- libmysqlclient16จากเก่าเดมี
libmysqlclient.so.16.0.0และ libmysqlclient.so.16symlink
- libmysqlclient18จากปัจจุบันเดมี
libmysqlclient.so.18.0.0และ libmysqlclient.so.18symlink