linux usr - ld找不到現有的庫




error lopencl (7)

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

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

我試圖用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

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


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

$ sudo apt-get install libtool

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


如上所述,鏈接器正在尋找libmagic.so ,但您只有libmagic.so.1

要解決此問題,只需執行更新緩存。

ldconfig -v 

要驗證您可以運行:

$ ldconfig -p | grep libmagic

將共享庫分離為其運行時組件( 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為我解決了這個問題。


正如剛剛通過grepsedawk制定的,答案在於g++-l選項,它調用ld 。 如果您查看此命令的手冊頁,則可以執行以下操作:

  • g++ -l:libmagic.so.1 [...]
  • 或者: g++ -lmagic [...] ,如果在libs路徑中有一個名為libmagic.so的符號鏈接

用於文件搜索
find / -xdev -name settings.xml - >整個計算機
find ./ -xdev -name settings.xml - >當前目錄及其子目錄

用於擴展類型的文件

find . -type f -name "*.iso"




linux gcc linker shared-libraries shared-objects