LD_LIBRARY_PATH อยู่ที่ไหน ฉันจะตั้งค่าตัวแปร LD_LIBRARY_PATH env ได้อย่างไร


26

ฉันกำลังพยายามสร้างโปรแกรม c ++ โดยใช้ Unix

ฉันได้รับข้อผิดพลาด

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

ฉันได้ยินมาว่าฉันแค่ต้องตั้งค่าตำแหน่งของ libboost * ในตัวแปร env LD_LIBRARY_PATH ของฉันแล้วเรียกใช้ make ตามที่ฉันได้ทำไว้โดยพิมพ์

-L /usr/lib64 -l boost_regex-mt

หรือ

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

แต่ LD_LIBRARY_PATH อยู่ที่ไหน ฉันจะตั้งค่าตัวแปร LD_LIBRARY_PATH env ได้อย่างไร


ทำไมคุณถึงแก้ไขคำถามส่วนใหญ่ในขณะที่ให้บริบทที่มีประโยชน์เพื่อทำความเข้าใจปัญหาของคุณ
jlliagre

@jlliagre ฉันเห็นด้วย: หากไม่มีบริบทที่มาจากคำถามเดิมคำตอบที่ได้รับคะแนนสูงสุดก็ไม่มีเหตุผล ฉันย้อนกลับ
John1024

คำตอบ:


25

ฉันจะตั้งค่าตัวแปร LD_LIBRARY_PATH env ได้อย่างไร

คุณได้ตั้งค่าไว้เมื่อคุณทำสิ่งนี้:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

แต่นั่นจะไม่แก้ปัญหาของคุณ $LD_LIBRARY_PATHมีการปรึกษาในเวลาดำเนินการเพื่อให้รายการของไดเรกทอรีเพิ่มเติมที่จะค้นหาห้องสมุดเชื่อมโยงแบบไดนามิก มันไม่ได้รับการพิจารณาในเวลาเชื่อมโยง (ยกเว้นสำหรับการค้นหาไลบรารีที่ต้องการโดยเครื่องมือที่สร้างขึ้นเอง!)

เพื่อบอกลิงเกอร์ว่าจะหา-Lไลบรารี่ในเวลาบิลด์คุณจะต้องใช้ตัวเลือกลิงเกอร์ คุณทำเช่นนั้นแล้ว:

-L /usr/lib64

หากคุณยังคงได้รับข้อผิดพลาดคุณต้องตรวจสอบให้แน่ใจว่ามีไลบรารีอยู่จริง คุณมีไฟล์libboost_regex-mt.soหรือlibboost_regex-mt.aในไดเรกทอรีนั้น (หรือมี) ไหม? โปรดทราบว่าไฟล์เช่นlibboost_regex-mt.so.othersuffixนี้จะไม่นับรวมในวัตถุประสงค์นี้ หากคุณไม่มีสิ่งนั้นคุณอาจต้องติดตั้งแพ็กเกจการพัฒนาของการแจกจ่ายสำหรับไลบรารีนี้


ภายใต้ Linux อ้างอิงจากหน้า man ld (1) ซึ่ง$LD_LIBRARY_PATHถูกปรึกษาด้วยld: « 5. สำหรับ linker ดั้งเดิมให้ค้นหาเนื้อหาของตัวแปรสภาพแวดล้อม "LD_LIBRARY_PATH" »
vinc17

@csx - distro ของคุณคืออะไร? Ubuntu, Fedora, CentOS และอื่น ๆ ดูที่นี่สำหรับตัวอย่างเช่น: stackoverflow.com/questions/15874220/…
slm

@ vinc17 ข้อความที่อ้างจากldmanpage นั้นเกี่ยวข้องกับการอ้างอิงแบบเรียกซ้ำ: ไลบรารีที่พึ่งพาของไลบรารีที่ถูกเลือกให้เชื่อมโยงแล้วมันไม่เกี่ยวข้องกับการค้นหาไลบรารีสำหรับปฏิบัติการที่ถูกสร้างขึ้น นั่นคือสิ่งที่-Lทำ
Celada

@csx ฉันไม่รู้อะไรเกี่ยวกับลินุกซ์ทางวิทยาศาสตร์ แต่ถ้าapt-getให้คำสั่งไม่พบคุณก็ไม่ได้มาจาก Debian ดังนั้นคุณต้องมีวิธีอื่นในการติดตั้งแพ็คเกจที่ขาดหายไป นั่นคือปัญหาของคุณแน่นอน
Celada

ล่าช้า แต่: -Ldir -llibควรทำงานเป็นอาร์กิวเมนต์ไปยังldหรือgcc/g++/etcเมื่อรวมถึงเฟสลิงก์ แต่เป็นต้นฉบับ & ที่ได้รับการกล่าวถึง Q make: ด้วย makefile ปกติที่คุณอาจต้องใช้LDFLAGS="whatever"และด้วย makefile ที่ฉลาดคุณอาจต้องการเกือบทุกอย่าง
dave_thompson_085

11

อีกวิธีในการเพิ่มเส้นทางใหม่อย่างถาวรใน LD_LIBRARY_PATH:

แก้ไขไฟล์ใน.conf/etc/ld.so.conf.d/

ฉันเคยติดตั้งแอปพลิเคชั่นแล้วและแอปพลิเคชันอื่นไม่สามารถจดจำไลบรารีได้ จากนั้นฉันจะเพิ่มเส้นทางเช่น/usr/local/hdf5/libไปยังx86_64-linux-gnu.confไฟล์ เพียงใส่ในบรรทัดถัดไป บันทึก

จากนั้นเรียกใช้ sudo ldconfig

มันได้ผล

PS: ระบบปฏิบัติการ Ubuntu 14.04


4

คุณสามารถตั้งค่าใน~/.profileไฟล์ init ของคุณและ / หรือเชลล์ของคุณ (เช่น~/.bashrcสำหรับ bash, ~/.zshenvสำหรับ zsh) จากนั้นคุณต้องรีสตาร์ทเชลล์ของคุณ (และอาจออกจากระบบและเข้าสู่ระบบอีกครั้งขึ้นอยู่กับทางเลือกของคุณ)

คุณสามารถตรวจสอบการตั้งค่าของคุณด้วย:

env | grep '^LD_LIBRARY_PATH'

แก้ไข: LD_LIBRARY_PATHใช้สำหรับไลบรารีที่แบ่งใช้ซึ่งมีรหัสเครื่องโดยทั่วไปชื่อไฟล์จะมี.soชื่ออยู่ในนั้นอาจตามด้วยตัวเลขคั่นด้วยเครื่องหมายจุดเพื่อแยกความแตกต่างของรุ่นต่าง ๆ เป็นไปได้ว่าแม้LD_LIBRARY_PATHจะไม่พบห้องสมุดเพราะ ABI ไม่ตรงกัน ยังทราบว่าภาษา (เช่น Perl และ Python) และแพคเกจอาจจะมีระบบของตัวเองของห้องสมุด (อาจจะยังมี.soไฟล์) LD_LIBRARY_PATHเพื่อที่ไม่เกี่ยวข้องกัน


โปรแกรมที่คอมไพล์ของฉันยังคงบ่นว่าไม่ได้ค้นหาไลบรารีหลามแม้ว่าฉันเห็นเส้นทางที่ถูกต้องโดยใช้ env | grep '^ LD_LIBRARY_PATH' มีปัญหาอะไรบ้าง?
Herman Toothrot

@HermanToothrot ฉันได้อัปเดตคำตอบของฉันแล้ว โปรดทราบว่าหลามมีระบบห้องสมุดของตัวเอง ฉันสงสัยว่าไม่ได้ใช้LD_LIBRARY_PATH(เพื่อหลีกเลี่ยงการชนกับไลบรารีปกติ) คุณต้องถามคำถามเฉพาะสำหรับเรื่องนี้พร้อมกับข้อความแสดงข้อผิดพลาดที่คุณได้รับ
vinc17

3

หากข้อผิดพลาดพา ธ ไลบรารีของคุณอยู่ในตัวเชื่อมโยงระหว่างการคอมไพล์คุณต้องเพิ่มพา ธ ไปยังไลบรารีในตัวแปร $ LD_LIBRARY_PATH หากข้อผิดพลาดของไลบรารีคือเมื่อคุณรันโปรแกรมที่คอมไพล์แล้วคุณจำเป็นต้องเพิ่มพา ธ ไลบรารีไปยัง /etc/ld.so.conf และรัน ldconfig เพื่อสร้างแคชพา ธ การค้นหาไลบรารีใหม่


มันใช้งานได้ดี! ไฟล์ conf ของฉันชี้ไปที่ไดเร็กตอรี่ /etc/ld.so.conf.d นี้ดังนั้นให้เพิ่มไฟล์ที่มีพา ธ libs ของคุณไปยังโฟลเดอร์นั้น นอกจากนี้ยังให้แน่ใจว่าจะทำงาน ldconfig เป็นราก (หรือ sudo มัน)
RLaaa

0

แก้ไขด้วย:

เพิ่มเข้าไป /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.