ซ้อนห้องสมุดคงที่เป็นไปได้?


12

ฉันกำลังทำงานใน QT

  1. ไลบรารีแบบสแตติกสามารถขึ้นอยู่กับไลบรารีแบบสแตติกอื่นได้หรือไม่ (Static Lib ถูกสร้างโดยการเชื่อมโยงแบบสแตติกแบบอื่น)
  2. ถ้าใช่เป็นไปได้ไหมว่าหลังจากเชื่อมโยงไปยัง lib2 แล้ว lib ที่สร้างขึ้น (lib1) จะไม่ประกอบด้วยรหัสทั้งหมดของ lib2 หรือไม่

ในโครงการ Qt ของฉันฉันใช้ไลบรารีแบบสแตติกซึ่งขึ้นอยู่กับหลายไลบรารี ฉันต้องเพิ่มไลบรารีทั้งหมด (โดยมีส่วนหัวทั้งหมดในโครงการของฉัน) แม้ว่าฉันต้องการเพียงหนึ่ง lib (และหนึ่ง .h ของคลาสนั้น) ในรหัสของฉัน

กรุณาอธิบายสถานการณ์

คำตอบ:


6

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

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

2) คำตอบสำหรับสิ่งนี้คือสิ่งเดียวที่คุณต้องทำก็คืออย่าลิงก์ใน lib2 ระหว่างการเชื่อมโยงของ lib1

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


มันหมายถึง lib แบบคงที่ซึ่งขึ้นอยู่กับ lib แบบคงที่อื่น แต่มีข้อมูลการเชื่อมโยงของ lib นั้นเป็นไปได้นั่นหมายความว่าเมื่อฉันต้องการรวม lib ครั้งแรกในโครงการของฉันฉันถูกผูกไว้เพื่อรวมวินาที Bcoz, lib แรกไม่ได้มีทั้งรหัสของ lib.A ที่สองใช่ไหม?
sk patra

6

สองบิตที่รวดเร็วของฉันในเรื่องนี้: 10 (เรื่องตลกที่น่ากลัวขออภัย)

หากต้องการขยายออกไปเล็กน้อยไปที่นี่:

1- ห้องสมุดคงสามารถขึ้นอยู่กับคงที่ห้องสมุดอื่นไม่มีอะไรหรือแม้กระทั่งห้องสมุดแบบไดนามิก: ในสองกรณีแรกรหัสทั้งหมดสำหรับห้องสมุดคงใหม่จะถูกรวมอยู่ใน SLL ใหม่ (Static Link Library) แต่ตัวเลือกที่ 3 ขึ้นอยู่กับสภาพแวดล้อมที่อาจนำไปสู่ ​​SLL ที่มีหนึ่งในผลลัพธ์ต่อไปนี้

  • มันจะมีโค้ดสแตติกที่จำเป็นซึ่งรวบรวมจาก DLL (Dynamic Link Library)
  • หรือที่น่ากลัวกว่านั้นคือคุณจะมีไลบรารี่คงที่เมื่อรวมอยู่ในโครงการจะทำให้ความต้องการในการจัดส่งด้วย DLL ทำลายจุดเชื่อมโยงคงที่ทั้งหมด

ดังนั้นในระยะสั้นคุณสามารถเชื่อมโยงไลบรารีคงที่กับไลบรารีแบบคงที่ได้

2- หาก lib1 และ lib2 เป็นทั้งแบบคงที่และ lib1 เชื่อมโยงกับ lib2 แล้วการทำงานทั้งหมดของ lib2 จะมีให้ภายใน lib1 โดยไม่จำเป็นต้องใส่ lib2 เนื่องจาก lib2 จะเชื่อมโยงแบบคงที่ภายใน lib1 (คิดว่าตุ๊กตารัสเซียกับ lib2 มีขนาดเล็กลง)

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

ทำสิ่งต่อไปนี้: ไฟล์. h หนึ่งไฟล์ที่มีการอ้างอิงถึง 6 ไลบรารีที่ลิงก์แบบสแตติก: คุณจะต้องรวม 7 ไฟล์ในโครงการของคุณเพื่อรับฟังก์ชั่นเต็มรูปแบบ

ตัวอย่างการรวม 1

หนึ่ง SLL ซึ่งสร้างขึ้นจากไฟล์. h ที่กล่าวมานั้นต้องการเพียง SLL ใหม่เท่านั้นที่จะถูกรวมไว้สำหรับการลิงก์ที่คอมไพล์:

ตัวอย่างการรวม 2

หวังว่าจะช่วยได้และฉันเข้าใจสิ่งที่คุณถาม

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