Ubuntu ค้นหาไลบรารี่ที่ใช้ร่วมกันที่ไหน


24

เมื่อฉันเรียกใช้กระบวนการที่เชื่อมโยงไปยังไลบรารีที่ใช้ร่วมกันที่รันไทม์ (เชื่อมโยงเมื่อกระบวนการเริ่มต้นไม่ได้เชื่อมโยงในภายหลังด้วยdlload()) มันจะค้นหา.soไฟล์shared library ( ) อื่น ๆ ที่นอกเหนือจากที่LD_LIBRARY_PATHใด?

พื้นหลัง:

ฉันมีรหัส C ++ ที่ฉันเขียนซึ่งใช้ห้องสมุดบุคคลที่สามโดยเฉพาะ ฉันได้ติดตั้งไลบรารีและรวบรวมรหัสของฉันบนแพลตฟอร์มที่แตกต่างกันสองแห่งทั้ง Ubuntu แต่รุ่นที่แตกต่างกันและรุ่น gcc ที่แตกต่างกันเช่นกัน ไลบรารีถูกคอมไพล์และติดตั้งจากซอร์สและอยู่ใน/usr/local/libทั้งสองแพลตฟอร์ม เมื่อฉันรวบรวมรหัสของฉันฉันจะเชื่อมโยงกับpkg-config --libsพารามิเตอร์สำหรับห้องสมุดบุคคลที่สามและฉันได้รับการตรวจสอบแล้วว่าได้pkg-config --libsผลลัพธ์เหมือนกันทั้งสองแพลตฟอร์ม

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

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

สนุกพอคนที่ไม่ทำงานคือUbuntu และ gcc รุ่นใหม่ : /

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

ปรับปรุง:

นี่คือผลลัพธ์ของฉันจาก cat /etc/ld.so.conf.d/*

... กับระบบที่ทำงาน (เก่ากว่า):

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... ในระบบที่เสีย (ใหม่กว่า):

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
ฉันคิดว่าสถานที่เหล่านั้นถูกกำหนดไว้/etc/ld.so.conf.d/*.confแต่ฉันไม่แน่ใจ
เซเลม

ดูเหมือนว่ามัน แต่ดูการปรับปรุงของฉันไปที่ OQ สำหรับเนื้อหาของไฟล์เหล่านั้น ... ดังนั้นดูเหมือนว่ามันควรจะหา/usr/local/lib/libthrift-0.9.0.soแต่มันก็ยังให้ข้อผิดพลาดerror while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... มีเหตุผลที่จะไม่รับไดเรกทอรีจาก/etc/ld.so.conf.d/*.confไหน?
Dave Lillethun

3
ลองเรียกใช้sudo ldconfig -vตามที่แนะนำด้านล่าง ldd /path/to/your/applicationถ้ามันยังไม่ทำงานปรับปรุงคำถามของคุณด้วยการส่งออกของ
เซเลม

คำตอบ:


29

ธุรกิจเส้นทางทั้งหมดนี้เกี่ยวข้องกับสิ่งที่เรียกว่า multi-arch โดยพื้นฐานแล้วมันจะอนุญาตให้คุณมีไลบรารี่ 32 บิตและ 64 บิตในระบบเดียวกัน

หลังจากที่คุณคัดลอกไฟล์แล้วคุณได้เรียกใช้ ldconfig ไหม

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

ฉันวิ่งsudo ldconfigและแก้ไขปัญหาได้แล้ว! (ไม่จำเป็นต้องคอมไพล์รหัสหรืออะไรอีก ... ) ฉันแค่อยากจะเข้าใจ แต่ ... คุณพูดว่า "หลังจากที่คุณคัดลอกไฟล์" แต่ฉันไม่ได้คัดลอกไฟล์ คุณหมายถึงหลังจากที่ฉันสร้างและติดตั้งห้องสมุดหรือหลังจากที่ฉันรวบรวมโปรแกรม?
Dave Lillethun

หลังจากที่คุณวางมันไว้ที่ที่คุณวางไว้ โดยทั่วไปแคชไลบรารีจะถูกสร้างขึ้น ฉันคิดว่าการรีบูตอาจสร้างแคชใหม่
Matt H

ฉันอาจเข้าใจผิด แต่ฉันเชื่อว่าฉันได้เริ่มระบบใหม่ตั้งแต่ติดตั้งห้องสมุด ... อย่างไรก็ตามsudo ldconfigทำตามคำแนะนำได้แล้ว นี่เป็นบางสิ่งที่ไลบรารี่มักจะทำงานโดยอัตโนมัติเพื่อให้คุณเป็นส่วนหนึ่งของการติดตั้งหรือไม่ เพียงแค่สงสัยว่าทำไมฉันไม่ได้ "ปกติ" มีการทำเช่นนี้ แต่เฉพาะในกรณีนี้ ...
เดฟ Lillethun

โดยปกติการติดตั้งแพ็คเกจจะเรียกใช้ ldconfig ในระหว่างกระบวนการติดตั้งที่ฉันคิด บางทีเวอร์ชันใน distro ที่ใหม่กว่าของคุณอาจไม่ได้ทำด้วยเหตุผลบางอย่าง
Matt H

1

ข้อมูลที่มีอยู่ในคำถามข้างต้นและคำตอบแรก (และ ATT เท่านั้น) ช่วยฉันแก้ไข * ปัญหาที่คล้ายกันของฉันในWSL Ubuntu (บน Win10 64)!

ในกรณีของฉันปฏิบัติการไม่สามารถหาห้องสมุด ในท้ายที่สุดผมสังเกตเห็นว่าห้องสมุดใหม่ทำให้ได้ตำแหน่งใน/usr/lib64, แต่เส้นหลายซุ้ม/etc/ld.so.conf.d/x86_64-linux-gnu.conf ไม่ได้รวมถึงไดเรกทอรีที่

ดังนั้นฉันวิ่ง

sudo ldconfig /usr/lib64

และในที่สุดก็แก้ไขมัน (การรันด้วยตัวเองโดยไม่มีพารามิเตอร์ไดเรกทอรีไม่ได้ทำให้ 'น่าอัศจรรย์' ค้นหาไลบรารี BTW) มันไม่ชัดเจนว่า 'เริ่มต้นใหม่' การทุบตี WSL ของฉันช่วย ... ฉันคิดว่ามันไม่จำเป็นแม้แต่


เกิดขึ้นกับฉันด้วย / usr / local / lib / ฉันสร้างไฟล์/etc/ld.so.conf.d/usr-local.confแล้ววิ่งsudo ldconfigโดยไม่มีผลกระทบ - ตัวโหลดในไลบรารี dir นั้นไม่พบโดยตัวโหลด หลังจากทำงานsudo ldconfig /usr/local/libทุกอย่างทำงานได้ดี
Josh Milthorpe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.