ที่จริงแล้วคุณสามารถติดตั้งไลบรารี่ที่แชร์ได้หลายเวอร์ชั่นถ้าทำได้ถูกต้อง
ไลบรารีที่แบ่งใช้มักจะตั้งชื่อดังนี้:
lib<name>.so.<api-version>.<minor>
ถัดไปมี symlinks ไปยังไลบรารีภายใต้ชื่อต่อไปนี้:
lib<name>.so
lib<name>.so.<api-version>
เมื่อนักพัฒนาลิงก์กับไลบรารีเพื่อสร้างไบนารี่มันเป็นชื่อไฟล์ที่ลงท้ายด้วย.so
ที่ linker หา อาจมีเพียงหนึ่งรายการที่ติดตั้งพร้อมกันสำหรับแต่ละรายการ<name>
แต่นั่นหมายความว่านักพัฒนาซอฟต์แวร์ไม่สามารถกำหนดเป้าหมายไลบรารีหลายรุ่นในเวลาเดียวกันได้ ด้วยตัวจัดการแพคเกจ.so
symlink นี้เป็นส่วนหนึ่งของ-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.16
symlink
- libmysqlclient18จากปัจจุบันเดมี
libmysqlclient.so.18.0.0
และ libmysqlclient.so.18
symlink