ในบางครั้งหากเราไม่แสดงรายการ libs ตามลำดับที่แน่นอนภายใน makefile มันก็จะล้มเหลว
เหตุผลก็คือ - คำจำกัดความควรมาก่อนการใช้งาน
จะตรวจสอบคำสั่งซื้อที่ถูกต้องได้อย่างไร?
ในบางครั้งหากเราไม่แสดงรายการ libs ตามลำดับที่แน่นอนภายใน makefile มันก็จะล้มเหลว
เหตุผลก็คือ - คำจำกัดความควรมาก่อนการใช้งาน
จะตรวจสอบคำสั่งซื้อที่ถูกต้องได้อย่างไร?
ที่จริงแล้ว เมื่อทำการลิงก์ไลบรารี การใช้งานควรมาก่อนคำจำกัดความ สัญลักษณ์ที่ยังไม่ได้แก้ไขใดๆ จำเป็นต้องทราบก่อนจึงจะประมวลผลไฟล์ไลบรารีที่ให้คำจำกัดความได้
สิ่งที่มาพร้อมกับคำสั่งซื้อ ฉันเกรงว่าคุณจะต้องดำเนินการด้วยตนเอง หาก libA ขึ้นอยู่กับ libB (เช่น libA ใช้สัญลักษณ์จาก libB) คุณจะต้องลิงก์ตามลำดับนี้: -lA -lB
นี่เป็นเรื่องของเอกสารเป็นส่วนใหญ่ ไลบรารีที่มีเอกสารอย่างดีจะระบุอย่างชัดเจนว่าไลบรารีอื่นนั้นขึ้นอยู่กับไลบรารีใด ดังนั้นคุณจึงสามารถทราบลำดับการเชื่อมโยงที่ถูกต้องได้
หากคุณไม่ต้องการอ่านเอกสารหรือไม่มีเอกสาร การลองผิดลองถูกก็เป็นทางเลือกเสมอ :)
ฉันพบว่าสิ่งนี้น่ารำคาญเช่นกัน ฉันจำได้ว่าค้นหาเครื่องมือในการจัดเรียงให้ฉัน แต่ไม่พบสิ่งใดที่ช่วยได้
ในที่สุดฉันก็ตัดสินใจใช้วิธีเดรัจฉานบังคับ: หากคุณจะแสดงรายการ libs ทั้งหมดของคุณสองครั้งเช่น -lA -lB -lA -lB
จะรับประกันว่าทุกไลบรารีจะแสดงรายการก่อน (และหลัง) ไลบรารีอื่นๆ ทั้งหมด
เมื่อได้รับไลบรารี $(LIST)
คุณสามารถใช้ $(addprefix -l,$(LIST) $(LIST))
ได้
ไม่หรูหรามากนักและทำให้ขั้นตอนการเชื่อมโยงช้าลงบ้าง แต่ใช้งานได้
--start-group
และ --end-group
(หรือ -(
และ -)
) รอบๆ รายการไลบรารี เพื่อหลีกเลี่ยงการซ้ำซ้อน ตามคู่มือ binutils พบว่ามีต้นทุนด้านประสิทธิภาพที่สำคัญ
- person eriktous; 13.04.2011