LD_LIBRARY_PATH เทียบกับ LIBRARY_PATH


159

ฉันกำลังสร้างโปรแกรม C ++ แบบง่ายและฉันต้องการแทนที่ระบบที่ให้ไลบรารี่ที่ใช้ร่วมกันกับเวอร์ชันที่ใหม่กว่าชั่วคราวสำหรับการพัฒนาและการทดสอบ

ฉันพยายามตั้งค่าตัวแปร LD_LIBRARY_PATH แต่ตัวเชื่อมโยง (ld) ล้มเหลวด้วย:

/ usr / bin / ld: ไม่สามารถหา -lyaml-cpp

ฉันคาดว่าจะทำงานได้เพราะตามหน้า man ld:

ตัวลิงก์ใช้พา ธ การค้นหาต่อไปนี้เพื่อค้นหาไลบรารีแบบแบ่งใช้ที่จำเป็น: ... สำหรับตัวเชื่อมโยงแบบดั้งเดิมเนื้อหาของตัวแปรสภาพแวดล้อม "LD_LIBRARY_PATH" ...

ฉันลองตั้ง LIBRARY_PATH แล้วก็ใช้งานได้

ตามคู่มือ GCC:

ค่าของ LIBRARY_PATH เป็นรายการไดเร็กทอรีที่คั่นด้วยโคลอนเหมือนกับ PATH เมื่อกำหนดค่าเป็นคอมไพเลอร์เนทีฟ GCC จะพยายามไดเรกทอรีที่ระบุไว้เมื่อค้นหาไฟล์ลิงเกอร์พิเศษหากไม่สามารถค้นหาได้โดยใช้ GCC_EXEC_PREFIX การลิงก์โดยใช้ GCC ยังใช้ไดเรกทอรีเหล่านี้เมื่อค้นหาไลบรารีสามัญสำหรับตัวเลือก -l (แต่ไดเรกทอรีที่ระบุด้วย -L ​​จะมาก่อน)

ตามที่แนะนำ (GCC) แนะนำ LIBRARY_PATH ทำงานได้เพราะฉันเชื่อมโยงกับ GCC

แต่..

  • เนื่องจากฉันเชื่อมโยงกับ gcc เหตุใดจึงมีการเรียก ld เนื่องจากข้อความแสดงข้อผิดพลาดแนะนำ
  • อะไรคือจุดของการมีตัวแปรสองตัวที่ให้บริการเพื่อจุดประสงค์เดียวกัน มีความแตกต่างอื่น ๆ อีกไหม?

คำตอบ:


213

LIBRARY_PATH ถูกใช้โดย gcc ก่อนการรวบรวมเพื่อค้นหาไดเรกทอรีที่มีไลบรารีแบบคงที่และแบบแบ่งใช้ที่จำเป็นต้องเชื่อมโยงกับโปรแกรมของคุณ

LD_LIBRARY_PATHโปรแกรมของคุณใช้เพื่อค้นหาไดเรกทอรีที่มีไลบรารีที่ใช้ร่วมกันหลังจากที่รวบรวมและเชื่อมโยงสำเร็จแล้ว

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


14
และแน่นอน LD_LIBRARY_PATH เหมาะสมกับไลบรารีแบบไดนามิกเท่านั้น
Alex Jasmin

2
จุดของฉันคือถ้าฉันจะใช้ ld สำหรับการเชื่อมโยง (โดยตรง) จากนั้นตามคู่มือ ld, LD_LIBRARY_PATH จะถูกใช้เพื่อค้นหาไดเรกทอรีที่มีห้องสมุดที่ต้องเชื่อมโยงกับโปรแกรมของฉัน ฉันต้องคิดถึงบางสิ่งบางอย่างที่นี่ ..
Georgios Politis

2
ยกเว้นว่าคุณจะเรียกใช้ ld ด้วยตัวคุณเองและรวมไฟล์วัตถุกับไลบรารีมันจะ 'สืบทอด' พา ธ ที่ gcc ผ่านไป คุณสามารถแทนที่ gcc มาตรฐานด้วยตัวเลือก -Xlinker
Naveen

5
ที่จริงแล้วLIBRARY_PATH ใช้สำหรับค้นหาไดเรกทอรีที่มีสแตติกและไดนามิกไลบรารีแทนเฉพาะสแตติกไลบรารี
particle128

3
ใช่นี่เป็นสิ่งที่ผิด - ความแตกต่างคือการLIBRARY_PATHค้นหาห้องสมุด (คงที่หรือแบบไดนามิก) ในเวลารวบรวมและLD_LIBRARY_PATHมีการค้นหาห้องสมุดแบบไดนามิกในเวลาทำงาน แน่นอน ณ รันไทม์คุณไม่จำเป็นต้องค้นหาไลบรารีแบบสแตติก
Timmmm

47

LD_LIBRARY_PATHมีการค้นหาเมื่อโปรแกรมเริ่มต้นLIBRARY_PATHค้นหาในเวลาลิงค์

ข้อแม้จากความคิดเห็น :


38
หมายเหตุ: เมื่อเชื่อมโยงห้องสมุดldด้วยตัวเองไม่ได้ดูสำหรับห้องสมุดทั้งในหรือLIBRARY_PATH LD_LIBRARY_PATHมันก็ต่อเมื่อมีการgccเรียกใช้ldที่LIBRARY_PATHจะกลายเป็น (เรียนรู้วิธีนี้อย่างหนัก)
Rufflewind

1
@ หมุนที่น่าสนใจ แต่น่าจะมากกว่านี้ถ้าคุณให้การอ้างอิงใด ๆ
hmijail mourns ลาออกจากตำแหน่ง

มุมมองนี้สร้างความแตกต่างในช่วงเวลาที่ไลบรารีถูกค้นหา (เวลาลิงก์กับเวลารัน) ขณะที่ @Naveen สร้างความแตกต่างของประเภทของห้องสมุดที่ค้นหา (static v dynamic) มีสองมุมมองที่เหมือนกันอย่างมีประสิทธิภาพ (ไดนามิก: เวลารัน = คงที่: เวลาลิงก์) หรือมีสถานการณ์ที่สำคัญเมื่อการติดต่อนี้ไม่ถือ? ฉันเดาว่าความรู้บางอย่างเกี่ยวกับไลบรารี่แบบไดนามิกนั้นจำเป็นต้องใช้ในเวลารวบรวม
XavierStuvw

13

เนื่องจากฉันเชื่อมโยงกับ gcc เหตุใดจึงมีการเรียก ld เนื่องจากข้อความแสดงข้อผิดพลาดแนะนำ

gcc เรียก ld ภายในเมื่ออยู่ในโหมดเชื่อมโยง

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