ld ไม่พบห้องสมุดที่มีอยู่


169

ฉันกำลังพยายามเชื่อมโยงแอปพลิเคชันกับ g ++ บนระบบ Debian lenny นี้ ld กำลังบ่นว่าไม่พบไลบรารีที่ระบุ ตัวอย่างเฉพาะที่นี่คือ ImageMagick แต่ฉันมีปัญหาที่คล้ายกันกับห้องสมุดอื่น ๆ น้อยเกินไป

ฉันกำลังเรียกลิงเกอร์ด้วย:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic

ld บ่น:

/usr/bin/ld: cannot find -lmagic

อย่างไรก็ตาม libmagic มีอยู่:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

ฉันจะวินิจฉัยปัญหานี้เพิ่มเติมได้อย่างไรและมีอะไรผิดปกติหรือไม่ ฉันกำลังทำสิ่งที่โง่อย่างสมบูรณ์หรือไม่

คำตอบ:


158

ปัญหาคือ linker กำลังมองหาlibmagic.soแต่คุณมีlibmagic.so.1

แฮ็คอย่างรวดเร็วคือการเชื่อมโยงlibmagic.so.1ไปยังlibmagic.so


3
ใช้งานได้ฉันรู้สึกงุนงงว่ามันจะตั้งชื่อไฟล์ด้วยวิธีที่ไร้ประโยชน์โดยปริยาย - คุณช่วยให้คุณเข้าใจได้หรือไม่ว่าทำไมมันถึงทำแบบนี้โดยปริยาย?
maxpenguin

5
foo.so.1 เป็น symlink สำหรับ foo.so.1.0.0 เช่นกัน ด้วยวิธีนี้คุณสามารถมีไลบรารีหลายเวอร์ชันในระบบของคุณและหากแอปพลิเคชันต้องการไลบรารี่ที่เฉพาะเจาะจงมันสามารถลิงค์ไปยังไลบรารีนั้นโดยทั่วไปแล้วลิงค์ใหม่ล่าสุดจะถูกเลือกโดย symlink ฉันไม่ทราบว่าทำไม symlink นี้หายไป
Svante

46
libmagic.so.1 เป็น soname ซึ่งใช้โดยตัวเชื่อมโยงแบบไดนามิก libmagic.so ถูกใช้โดย linker และมักจะอยู่รวมกับส่วนหัวในแพ็คเกจ -dev symlink อาจหายไปเนื่องจากไม่ได้ติดตั้งแพ็คเกจ -dev
CesarB

13
ฉันมีปัญหาเดียวกัน ... แทนที่จะทำ "แฮ็ค" ฉันติดตั้งเวอร์ชัน "* -devel" และแก้ไขการคอมไพล์
เทรเวอร์บอยด์สมิ ธ

4
วิธีการ symlink libmagic.so.1 เพื่อ libmagic.so? และสถานที่ที่จะหาแพ็คเกจ "devel" เหล่านั้น
Black

68

ในฐานะที่เป็นเพียงแค่สูตรโดย grepsedawk คำตอบอยู่ใน-lตัวเลือกของการโทรg++ ldหากคุณดู man page ของคำสั่งนี้คุณสามารถทำได้:

  • g++ -l:libmagic.so.1 [...]
  • หรือ: g++ -lmagic [...]ถ้าคุณมี symlink ชื่อ libmagic.so ในเส้นทาง libs ของคุณ

หรือในการสรุปเอาคำนำหน้าเมื่อเชื่อมโยงกับมันเมื่อใช้ lib ควรจะเป็น -l-llibmagic-lmagic
phyatt

31

มันเป็นการประชุม Debian ที่จะแยกไลบรารีที่ใช้ร่วมกันออกเป็นองค์ประกอบรันไทม์ ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) และองค์ประกอบการพัฒนา ( libmagic-dev: /usr/lib/libmagic.so → …)

เนื่องจาก soname ของไลบรารีคือlibmagic.so.1นั่นคือสตริงที่ฝังลงในไฟล์เรียกทำงานดังนั้นจึงเป็นไฟล์ที่โหลดเมื่อเรียกใช้ไฟล์ปฏิบัติการ

อย่างไรก็ตามเนื่องจากไลบรารีถูกระบุว่าเป็น-lmagicตัวเชื่อมโยงจะค้นหาlibmagic.soซึ่งเป็นสาเหตุที่จำเป็นสำหรับการพัฒนา

ดูDiego E. Pettenò: ตัวเชื่อมโยงและชื่อสำหรับรายละเอียดเกี่ยวกับการทำงานทั้งหมดบน Linux


apt-get install libmagic-devในระยะสั้นที่คุณควร นี้จะไม่เพียงให้คุณlibmagic.soแต่ยังไฟล์อื่น ๆ /usr/include/magic.hที่จำเป็นสำหรับการรวบรวมเช่น


7

ใน Ubuntu คุณสามารถติดตั้งlibtoolซึ่งแก้ไขไลบรารีโดยอัตโนมัติ

$ sudo apt-get install libtool

สิ่งนี้ได้แก้ไขปัญหาltdlสำหรับฉันซึ่งได้รับการติดตั้งเป็นlibltdl.so.7และไม่พบเหมือน-lltdlในขั้นตอนการทำ


มันไม่ได้แก้ข้อผิดพลาด ไม่สามารถปรับ -LGL คุณช่วยให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ libtool ทำและวิธีแก้ปัญหาห้องสมุดได้อย่างไร
Shahryar Saljoughi

4

เว้นแต่ว่าฉันเข้าใจผิดอย่างรุนแรงlibmagicหรือ-lmagicไม่ใช่ไลบรารีเดียวกันกับ ImageMagick คุณระบุว่าคุณต้องการ ImageMagick

ImageMagick มาพร้อมกับยูทิลิตี้ในการจัดหาตัวเลือกที่เหมาะสมทั้งหมดให้กับคอมไพเลอร์

Ex:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"

4

ดังกล่าวข้างต้นลิงเกอร์ที่กำลังมองหาแต่คุณมีเพียงlibmagic.solibmagic.so.1

เพื่อแก้ปัญหานี้เพียงแค่ทำการอัพเดทแคช

ldconfig -v 

ในการยืนยันคุณสามารถเรียกใช้:

$ ldconfig -p | grep libmagic

1

การติดตั้ง libgl1-mesa-dev จาก Ubuntu repo แก้ปัญหานี้ให้ฉันได้


5
แน่นอนคุณไม่ทุกข์ทรมานจากข้อผิดพลาดสคริปต์เดียวกับ maxpenguin ในปี 2008
โสภิ

มันแก้ไขปัญหาของฉัน คุณช่วยกรุณาให้ข้อมูลเพิ่มเติมเกี่ยวกับมันคืออะไร และวิธีแก้ปัญหานี้? (ฉันหมายถึง: libgl1-mesa-dev) ขอบคุณ
Shahryar Saljoughi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.