ใช้ไลบรารีที่แบ่งใช้ใน / usr / local / lib


58

ฉันได้สร้างห้องสมุดบางแห่งจากแหล่งที่มาและไฟล์หลังจากmake installนั้นมา/usr/local/lib

ตัวอย่างเช่นในกรณีของฉันฉันมีไฟล์libodb-2.2.soที่อยู่ในไดเรกทอรีนี้

อย่างไรก็ตามเมื่อฉันเปิดใช้งานโปรแกรมที่เชื่อมโยงกับlibodbฉันได้รับข้อผิดพลาด: ข้อผิดพลาดขณะโหลดห้องสมุดสาธารณะlibodb-2.2.so: cannont open shared object file: No such file or directory.

มันหมายความว่าฉันได้สร้างปฏิบัติการของฉันไม่ถูกต้อง? หรือฉันควรระบุระบบว่าอาจมี libs ที่น่าสนใจในโฟลเดอร์/usr/local/libด้วย?

ฉันใช้ Ubuntu 12.04, Linux kernel 3.2.0-38-generic



ฉันขอแนะนำให้คุณสร้างมิตรภาพที่ดีกับดีบักเกอร์ของคุณ
DDS

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

ขออภัย ... ความคิดเห็นนี้ควรถูกวางไว้บน stackoverflow สำหรับคำถามของผู้เรียนเกี่ยวกับการเขียนโปรแกรม C ... แค่ไม่ได้เห็นคือ U&L
DDS

@DDS เริ่มต้นที่การเรียนรู้การเขียนโปรแกรม C หรือที่การเรียนรู้การสร้างบน Linux? โปรดแม่นยำยิ่งขึ้น เช่นฉันมาจาก Windows นั่นไม่ได้หมายความว่าฉันไม่รู้ C ++ ... ฉันมักจะคิดว่าพฤติกรรมการตัดสินของคุณไม่ถูกต้อง แม้ว่ามันจะเป็นเช่นนั้นพฤติกรรมของคุณจะได้รับความสนใจจากผู้ดูแลในไม่ช้า ระวังให้ดี คุณอยู่ในไซต์ COLLABORATIVE ซึ่งเป็นโปรแกรมเมอร์ที่กระตือรือร้นแบ่งปันความรู้ที่เป็นประโยชน์ ไม่ออกแบบที่ไหนสักแห่งเพื่ออีโก้ของคุณ (ไม่ต้องกังวลฉันยังถูกเบา ๆ / ทุบตีอย่างสมเหตุสมผลเมื่อฉันเริ่มต้นดังนั้นและฉันคิดว่านั่นเป็นสิ่งที่ดีจริงๆที่เกิดขึ้น)
Stephane Rolland

คำตอบ:


58

สำหรับเซสชันปัจจุบันคุณสามารถ

ส่งออก LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

หรือเพื่อให้การเปลี่ยนแปลงอย่างถาวรคุณสามารถเพิ่ม/usr/local/libไป/etc/ld.so.conf(หรือบางสิ่งบางอย่างมันมี) และใช้ldconfigเป็นราก

หากคุณยังมีปัญหาอยู่การเรียกใช้ldd [executable name]จะแสดงให้คุณเห็นว่าห้องสมุดกำลังพยายามค้นหาและไม่พบห้องสมุดใด ๆ


3
จากmanหน้าสำหรับldd(1)"ในกรณีปกติ ldd เรียกใช้ตัวเชื่อมโยงแบบไดนามิกมาตรฐาน (ดูld.so(8)) ด้วยLD_TRACE_LOADED_OBJECTSตัวแปรสภาพแวดล้อมที่ตั้งค่า1ซึ่งทำให้ตัวเชื่อมโยงเพื่อแสดงการอ้างอิงไลบรารีอย่างไรก็ตามโปรดทราบว่าในบางสถานการณ์บางรุ่นlddอาจ พยายามรับข้อมูลการพึ่งพาโดยการเรียกใช้งานโปรแกรมโดยตรงดังนั้นคุณไม่ควรใช้งานlddโปรแกรมที่ไม่น่าเชื่อถือเนื่องจากอาจส่งผลให้เกิดการใช้รหัสโดย
อำเภอใจ

4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven

เป็นคนดี - ฉันไม่เคยเจอ objdump มาก่อน
Flup

ตามนี้บทความคำตอบนี้เป็น canonically ที่ไม่ถูกต้องและเป็นอันตราย สำหรับวิธีการที่ถูกต้องของการใช้งาน-Lและ-rpathในระหว่างการรวบรวมเพื่อกำหนดเส้นทางการค้นหาการเชื่อมโยงและเส้นทางการค้นหารันไทม์สำหรับห้องสมุดเป็นวิธีที่ถูกต้องตามนี้คำถามและคำตอบ
Cliff Armstrong

36

หากคุณได้ทำงานldconfigหลังจากสร้างห้องสมุดแล้วอ่านต่อไป ถ้าไม่อ่าน aboout ldconfigก่อน

/usr/local/libอาจไม่อยู่ในเส้นทางไลบรารีที่ ldconfig ใช้ คุณสามารถทำสิ่งนี้:

ldconfig /usr/local/lib

และสิ่งที่ควรเพิ่มลงในแคช linker แต่มันอาจจะดีกว่าที่จะเพิ่มเส้นทางอย่างถูกต้อง ตรวจสอบให้แน่ใจว่าคุณมี/etc/ld.so.conf.dไดเรกทอรี ถ้าเป็นเช่นนั้นเพิ่มไฟล์ (เรียกมันว่า "usr-local.conf" หรืออะไรก็ตาม) และใส่หนึ่งบรรทัดในนั้น:

/usr/local/lib

ldconfigตอนนี้ใช้ หากคุณไม่มีไดเร็กทอรี ld.so.conf.d คุณควรมี/etc/ld.so.conf ไฟล์และคุณสามารถเพิ่มบรรทัดนั้นไปยังส่วนท้ายได้


3
ฉันได้เพิ่มไฟล์ custom.conf ไปยัง/etc/ld.so.conf.dsudoed ldconfig เพื่อพิจารณามันและปฏิบัติการของฉันสามารถเริ่มได้แล้วตอนนี้
Stephane Rolland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.