.dll
หรือ.so
เป็น libs ที่ใช้ร่วมกัน (เชื่อมโยงในรันไทม์) ขณะที่.a
และ.lib
เป็นห้องสมุดแบบคงที่ (เชื่อมโยงในเวลารวบรวม) นี่ไม่ใช่ความแตกต่างระหว่าง Windows และ Linux
ความแตกต่างคือพวกเขาจัดการอย่างไร หมายเหตุ: ความแตกต่างเฉพาะในศุลกากรพวกเขาจะใช้อย่างไร มันคงไม่ยากเกินไปที่จะทำให้ลีนุกซ์สร้างขึ้นบน Windows และในทางกลับกันยกเว้นว่าไม่มีใครทำสิ่งนี้
หากเราใช้ dll หรือเรียกฟังก์ชันแม้แต่จากไบนารีของเราเองก็มีวิธีที่ง่ายและชัดเจน ตัวอย่างเช่นใน C เราจะเห็นว่า:
int example(int x) {
...do_something...
}
int ret = example(42);
อย่างไรก็ตามในระดับ asm อาจมีความแตกต่างมากมาย ตัวอย่างเช่นบน x86 call
opcode จะถูกดำเนินการและ42
จะได้รับบนสแต็ก หรือในบางทะเบียน หรือที่ไหนก็ได้ ไม่มีใครรู้ว่าก่อนจะเขียน dllวิธีการที่จะใช้ หรือว่าโครงการจะต้องการใช้มันเป็นไปได้เขียนด้วยคอมไพเลอร์ (หรือในภาษา!) ซึ่งไม่ได้อยู่ตอนนี้ (หรือมันไม่เป็นที่รู้จักสำหรับนักพัฒนาของ dll)
ตัวอย่างเช่นโดยค่าเริ่มต้นทั้ง C และ Pascal วางอาร์กิวเมนต์ (และรับค่าส่งคืน) จากสแต็ก - แต่พวกเขากำลังทำตามลำดับที่แตกต่างกันแต่พวกเขาจะทำมันในการสั่งซื้อที่แตกต่างกันนอกจากนี้คุณยังสามารถแลกเปลี่ยนข้อโต้แย้งระหว่างฟังก์ชั่นของคุณในการลงทะเบียนโดยการเพิ่มประสิทธิภาพที่ขึ้นอยู่กับคอมไพเลอร์
ตามที่คุณเห็นอย่างถูกต้อง Windows ที่กำหนดเองคือการสร้าง dll เรายังสร้างขั้นต่ำ.a
/.lib
ด้วย ไลบรารีแบบสแตติกขั้นต่ำนี้เป็นเพียงเครื่องห่อหุ้มสัญลักษณ์ (ฟังก์ชั่น) ของ dll นั้นจะถูกส่งถึงมัน ทำให้การแปลงการโทรระดับ asm ที่ต้องการ
ข้อได้เปรียบของมันคือความเข้ากันได้ ข้อเสียของมันคือถ้าคุณมีเพียง. dll คุณสามารถมีเวลายากที่จะคิดออกว่าฟังก์ชั่นที่ต้องการจะเรียกว่า สิ่งนี้ทำให้การใช้งานของ dll เป็นงานแฮ็คหากผู้พัฒนา dll ไม่ให้คุณ.a
ไม่ได้ให้คุณ ดังนั้นมันจึงมีวัตถุประสงค์เพื่อปิดส่วนใหญ่เช่นเพื่อให้ง่ายต่อการรับเงินพิเศษสำหรับ SDK
ข้อเสียอีกอย่างหนึ่งคือแม้ว่าคุณจะใช้ไลบรารี่แบบไดนามิกคุณต้องรวบรวมกระดาษห่อเล็ก ๆ นี้แบบคงที่
ใน Linux อินเทอร์เฟซแบบไบนารีของ DLLs เป็นมาตรฐานและปฏิบัติตามอนุสัญญา C ดังนั้นไม่.a
จำเป็นและมีความเข้ากันได้ของไบนารีระหว่าง libs ที่ใช้ร่วมกันเพื่อแลกเปลี่ยนเราไม่มีข้อได้เปรียบของ microsoft custom