linux - x86_64 - ld找不到現有的庫




usr bin x86_64 linux gnu ld cannot find (5)

我試圖用Debian lenny系統上的g ++連接一個應用程序。 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

我如何進一步診斷這個問題,以及可能會出現什麼問題? 我在做一些完全愚蠢的事情嗎?


問題是鏈接器正在尋找libmagic.so但你只有libmagic.so.1

快速入門是將libmagic.so.1符號鏈接到libmagic.so


在Ubuntu中,您可以安裝自動解析庫的libtool

$ sudo apt-get install libtool

這為我解決了一個問題,我已經安裝了libltdl.so.7並且沒有在make中找到-lltdl


將共享庫分離為其運行時組件( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0 )及其開發組件( libmagic-dev: /usr/lib/libmagic.so → … )是Debian的慣例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所需的其他文件。


從Ubuntu repo安裝libgl1-mesa-dev為我解決了這個問題。


除非我錯誤地將libmagic-lmagic與ImageMagick放在不同的庫中。 你聲明你想要ImageMagick。

ImageMagick附帶了一個實用程序來為編譯器提供所有適當的選項。

例如:

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






shared-objects