ฉันมีส่วนร่วมในการอภิปรายบางอย่างเกี่ยวกับห้องสมุดใน Linux และต้องการยืนยันบางสิ่ง
มันเป็นความเข้าใจของฉัน (โปรดแก้ไขให้ฉันถ้าฉันผิดและฉันจะแก้ไขโพสต์ของฉันในภายหลัง) ว่ามีสองวิธีในการใช้ห้องสมุดเมื่อสร้างแอปพลิเคชัน:
- สแตติกไลบรารี (ไฟล์. a): ณ เวลาลิงก์สำเนาของไลบรารีทั้งหมดจะถูกใส่ลงในแอปพลิเคชันสุดท้ายเพื่อให้ฟังก์ชั่นภายในไลบรารีพร้อมใช้งานสำหรับแอปพลิเคชันการโทรตลอดเวลา
- วัตถุที่ใช้ร่วมกัน (ไฟล์. so): ณ เวลาลิงก์วัตถุนั้นจะถูกตรวจสอบกับ API ผ่านไฟล์ส่วนหัว (.h) ที่เกี่ยวข้อง ห้องสมุดไม่ได้ใช้จริงจนกว่ารันไทม์ซึ่งเป็นที่ต้องการ
ข้อได้เปรียบที่ชัดเจนของสแตติกไลบรารีคือพวกเขาอนุญาตให้แอปพลิเคชันทั้งหมดอยู่ในตัวเองในขณะที่ประโยชน์ของไลบรารีแบบไดนามิกคือสามารถแทนที่ไฟล์ ".so" (เช่น: ในกรณีที่จำเป็นต้องอัปเดตเนื่องจากความปลอดภัย บั๊ก) โดยไม่ต้องการให้แอปพลิเคชันพื้นฐานทำการคอมไพล์ใหม่
ฉันเคยได้ยินบางคนสร้างความแตกต่างระหว่างวัตถุที่ใช้ร่วมกันและไลบรารีที่เชื่อมโยงแบบไดนามิก (DLL's) แม้ว่าพวกเขาจะเป็นทั้งไฟล์ ".so" ก็ตาม มีความแตกต่างระหว่างวัตถุที่ใช้ร่วมกันและ DLLs เมื่อมันมาถึงการพัฒนา C / C ++ บน Linux หรือระบบปฏิบัติการที่สอดคล้องกับ POSIX อื่น ๆ (เช่น: MINIX, UNIX, QNX, ฯลฯ )? ฉันได้รับการบอกว่าความแตกต่างที่สำคัญอย่างหนึ่ง (จนถึง) คือวัตถุที่ใช้ร่วมกันนั้นเพิ่งใช้งานในขณะที่ DLL ต้องเปิดก่อนโดยใช้การเรียก dlopen () ภายในแอปพลิเคชัน
ในที่สุดฉันก็เคยได้ยินนักพัฒนาบางคนพูดถึง "คลังเก็บที่ใช้ร่วมกัน" ซึ่งความเข้าใจของฉันก็เป็นห้องสมุดแบบสแตติกด้วยตนเอง แต่แอปพลิเคชันไม่เคยใช้โดยตรง แต่คงที่ห้องสมุดอื่น ๆ จะเชื่อมโยงกับ "คลังเก็บที่ใช้ร่วมกัน" เพื่อดึงฟังก์ชั่น / ทรัพยากรบางส่วน (แต่ไม่ทั้งหมด) จากการเก็บถาวรที่ใช้ร่วมกันลงในห้องสมุดคงที่ถูกสร้างขึ้น
ขอบคุณล่วงหน้าสำหรับความช่วยเหลือของคุณ
ปรับปรุง
ในบริบทที่ข้อกำหนดเหล่านี้ให้ฉันมันเป็นเงื่อนไขที่ผิดพลาดที่ใช้โดยทีมนักพัฒนา Windows ที่ต้องเรียนรู้ Linux ฉันพยายามที่จะแก้ไขพวกเขา แต่บรรทัดฐานทางภาษา (ไม่ถูกต้อง) ติดอยู่
- Shared Object: ไลบรารีที่เชื่อมโยงเข้ากับโปรแกรมโดยอัตโนมัติเมื่อโปรแกรมเริ่มทำงานและมีอยู่เป็นไฟล์สแตนด์อโลน ไลบรารีจะรวมอยู่ในรายการเชื่อมโยงในเวลารวบรวม (เช่น:
LDOPTS+=-lmylib
สำหรับไฟล์ไลบรารีที่ชื่อmylib.so
) ไลบรารีต้องแสดงในเวลารวบรวมและเมื่อแอปพลิเคชันเริ่มต้น - ห้องสมุดคงที่: ห้องสมุดที่ถูกรวมเข้าไปในโปรแกรมจริงในเวลาบิลด์สำหรับแอปพลิเคชั่นเดี่ยว (ใหญ่กว่า) ที่มีรหัสแอปพลิเคชันและรหัสห้องสมุดที่เชื่อมโยงเข้ากับโปรแกรมโดยอัตโนมัติเมื่อโปรแกรมถูกสร้างขึ้น โปรแกรมหลักและไลบรารีมีอยู่เป็นไฟล์ไบนารีแบบสแตนด์อโลนเดียว ห้องสมุดจะรวมอยู่ในรายการเชื่อมโยงในเวลารวบรวม (เช่น:
LDOPTS+=-lmylib
สำหรับไฟล์ไลบรารีชื่อ mylib.a) ห้องสมุดจะต้องปรากฏตัวในเวลารวบรวม - DLL: เป็นหลักเหมือนกับวัตถุที่ใช้ร่วมกัน แต่แทนที่จะรวมอยู่ในรายการการเชื่อมโยง ณ เวลารวบรวมไลบรารีจะถูกโหลดผ่าน
dlopen()
/dlsym()
คำสั่งเพื่อให้ไลบรารีไม่จำเป็นต้องอยู่ ณ เวลาบิลด์เพื่อให้โปรแกรมรวบรวม นอกจากนี้ไลบรารีไม่จำเป็นต้องมีอยู่ (จำเป็น) เมื่อเริ่มต้นแอปพลิเคชันหรือเวลารวบรวมเนื่องจากจำเป็นเท่านั้นในขณะที่มีการเรียกdlopen
/dlsym
เรียกใช้ - Shared Archive: เป็นหลักเช่นเดียวกับไลบรารีแบบสแตติก แต่ถูกคอมไพล์ด้วยแฟล็ก "export-shared" และ "-fPIC" ไลบรารีจะรวมอยู่ในรายการเชื่อมโยงในเวลารวบรวม (เช่น:
LDOPTS+=-lmylibS
สำหรับไฟล์ไลบรารีที่ชื่อmylibS.a
) ความแตกต่างระหว่างทั้งสองคือจำเป็นต้องมีการตั้งค่าสถานะเพิ่มเติมนี้ถ้าวัตถุที่ใช้ร่วมกันหรือ DLL ต้องการเชื่อมโยงการเก็บถาวรที่ใช้ร่วมกันแบบคงที่ลงในรหัสของตนเองและสามารถทำให้ฟังก์ชันในวัตถุที่ใช้ร่วมกันพร้อมใช้งานกับโปรแกรมอื่น ๆ ภายในกับ DLL สิ่งนี้มีประโยชน์ในกรณีที่มีคนให้ห้องสมุดแบบคงที่แก่คุณและคุณต้องการบรรจุใหม่เป็น SO ห้องสมุดจะต้องปรากฏตัวในเวลารวบรวม
ปรับปรุงเพิ่มเติม
ความแตกต่างระหว่าง " DLL
" และ " shared library
" เป็นแค่ภาษาพูด (ขี้เกียจไม่ถูกต้อง) ใน บริษัท ที่ฉันทำงานในเวลานั้น (นักพัฒนา Windows ถูกบังคับให้เปลี่ยนไปใช้การพัฒนา Linux และคำที่ติดอยู่) ตามคำอธิบายที่ระบุไว้ข้างต้น
นอกจากนี้S
ตัวอักษรต่อท้าย " " ตามหลังชื่อไลบรารีในกรณีของ "คลังข้อมูลที่ใช้ร่วมกัน" เป็นเพียงการประชุมที่ใช้ใน บริษัท นั้นและไม่ใช่ในอุตสาหกรรมโดยทั่วไป
.a
ไฟล์ "a" หมายถึง "archove" จริง ๆ และเป็นเพียงไฟล์เก็บถาวรของวัตถุ ตัวเชื่อมโยงที่ทันสมัยควรจะดีพอที่จะไม่จำเป็นต้องรวมขณะที่ไลบรารีเพียงแค่ไฟล์วัตถุในไฟล์เก็บถาวรที่จำเป็นและอาจใช้ส่วนของรหัส / ข้อมูลในไฟล์วัตถุที่อ้างอิง