เพิ่มเส้นทางไปยังที่ที่ห้องสมุดใหม่ของคุณจะไปLD_LIBRARY_PATH
(มีชื่อแตกต่างกันเล็กน้อยบน Mac ... )
โซลูชันของคุณควรทำงานร่วมกับการใช้-L/my/dir -lfoo
ตัวเลือกในขณะรันไทม์ใช้ LD_LIBRARY_PATH เพื่อชี้ไปยังตำแหน่งของไลบรารีของคุณ
ระมัดระวังในการใช้ LD_LIBRARY_PATH - โดยย่อ (จากลิงค์):
.. ผลกระทบ .. :
ความปลอดภัย : โปรดจำไว้ว่าไดเรกทอรีที่ระบุใน LD_LIBRARY_PATH ได้รับการค้นหาก่อน (!) ตำแหน่งมาตรฐาน? ด้วยวิธีนี้บุคคลที่น่ารังเกียจอาจทำให้แอปพลิเคชันของคุณโหลดเวอร์ชันของไลบรารีที่ใช้ร่วมกันซึ่งมีโค้ดที่เป็นอันตรายได้! นั่นเป็นสาเหตุหนึ่งที่ทำให้ไฟล์ปฏิบัติการ setuid / setgid ละเลยตัวแปรนั้น!
ประสิทธิภาพ: ตัวโหลดลิงก์ต้องค้นหาไดเร็กทอรีทั้งหมดที่ระบุจนกว่าจะพบไดเร็กทอรีที่ไลบรารีที่แบ่งใช้อยู่ - สำหรับไลบรารีที่ใช้ร่วมกันทั้งหมดแอปพลิเคชันจะเชื่อมโยง! ซึ่งหมายความว่าระบบจำนวนมากเรียกให้เปิด () ซึ่งจะล้มเหลวด้วย“ ENOENT (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)”! หากพา ธ มีไดเร็กทอรีจำนวนมากจำนวนการโทรที่ล้มเหลวจะเพิ่มขึ้นแบบเชิงเส้นและคุณสามารถบอกได้ตั้งแต่เวลาเริ่มต้นของแอปพลิเคชัน หากไดเร็กทอรีบางส่วน (หรือทั้งหมด) อยู่ในสภาพแวดล้อม NFS เวลาเริ่มต้นแอปพลิเคชันของคุณอาจใช้เวลานานมากและอาจทำให้ทั้งระบบช้าลง!
ความไม่สอดคล้องกัน: นี่เป็นปัญหาที่พบบ่อยที่สุด LD_LIBRARY_PATH บังคับให้แอปพลิเคชันโหลดไลบรารีที่แชร์ที่ไม่ได้เชื่อมโยงและมีแนวโน้มว่าจะเข้ากันไม่ได้กับเวอร์ชันดั้งเดิม สิ่งนี้อาจชัดเจนมากเช่นแอปพลิเคชันขัดข้องหรืออาจนำไปสู่ผลลัพธ์ที่ไม่ถูกต้องหากไลบรารีที่หยิบขึ้นมาไม่ได้ทำสิ่งที่เวอร์ชันดั้งเดิมจะทำ โดยเฉพาะอย่างยิ่งหลังบางครั้งก็ยากที่จะแก้ไขข้อบกพร่อง
หรือ
ใช้ตัวเลือก rpath ผ่าน gcc ไปยัง linker - เส้นทางการค้นหาไลบรารีรันไทม์จะถูกใช้แทนการค้นหาใน dir มาตรฐาน (ตัวเลือก gcc):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
นี่เป็นวิธีแก้ปัญหาชั่วคราว Linker ค้นหา LD_LIBRARY_PATH สำหรับไลบรารีก่อนที่จะค้นหาไดเร็กทอรีมาตรฐาน
หากคุณไม่ต้องการอัปเดต LD_LIBRARY_PATH อย่างถาวรคุณสามารถทำได้ทันทีบนบรรทัดคำสั่ง:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
คุณสามารถตรวจสอบสิ่งที่ตัวเชื่อมโยงไลบรารีรู้เกี่ยวกับการใช้ (ตัวอย่าง):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
และคุณสามารถตรวจสอบว่าแอปพลิเคชันของคุณใช้ไลบรารีใด:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
ไฟล์ที่มีอยู่และสถานที่ -.so
w / o การ.0
,.a
ฯลฯ ฯลฯ ?