ldは既存のライブラリを見つけることができません


169

この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

この問題をさらに診断するにはどうすればよいですか?私は完全に愚かなことをしていますか?

回答:


158

問題は、リンカーが探してlibmagic.soいるのですが、libmagic.so.1

簡単なハックはにシンボリックリンクlibmagic.so.1することですlibmagic.so


3
それが機能する、私はそれがデフォルトで完全に役に立たない方法でファイルに名前を付けるだろうと少し困惑しています-あなたはそれがなぜデフォルトでこれをするのか洞察を提供できますか?
maxpenguin 2008

5
foo.so.1もfoo.so.1.0.0へのシンボリックリンクです。このようにして、システムにライブラリの複数のバージョンを含めることができます。アプリケーションに特定のバージョンが必要な場合は、アプリケーションにリンクできますが、通常、最新のものはシンボリックリンクによって選択されます。このシンボリックリンクが欠落していた理由はわかりません。
Svante

46
libmagic.so.1は、動的リンカーが使用するsonameです。libmagic.soはリンカーによって使用され、通常は-devパッケージのヘッダーと一緒に使用されます。-devパッケージがインストールされていないため、シンボリックリンクが欠落している可能性があります。
CesarB 2008

13
私は同じ問題を抱えていました...「ハック」を実行する代わりに、「*-devel」バージョンをインストールしてコンパイルを修正しました。
Trevor Boyd Smith

4
libmagic.so.1をlibmagic.soにシンボリックリンクする方法は?そして、それらの「開発」パッケージを見つける場所
Black

69

grepsedawkによって策定されたとおり、答えは、の呼び出しの-lオプションにあります。このコマンドのmanページを見ると、次のいずれかを行うことができます。g++ld

  • g++ -l:libmagic.so.1 [...]
  • または:g++ -lmagic [...]libpathにlibmagic.soというシンボリックリンクがある場合

または要約libすると、を使用するときにリンクにリンクするときに、プレフィックスを削除します-l-llibmagicする必要があります-lmagic
phyatt 16

31

共有ライブラリをランタイムコンポーネント(libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0)と開発コンポーネント(libmagic-dev: /usr/lib/libmagic.so → …)に分離するのはDebianの規約です。

ライブラリのsonameはlibmagic.so.1であるため、これは実行可能ファイルに埋め込まれる文字列であり、実行可能ファイルの実行時に読み込まれるファイルです。

ただし、ライブラリは-lmagicリンカに対して指定されているためlibmagic.so、を探します。これが開発に必要な理由です。

参照ディエゴ・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単に-lltdlmakeで見つけられなかった問題を解決しました。


それはエラー解決しませんでした -LGLをうまくできません。libtoolの機能とライブラリの問題をどのように解決するかについて詳しく教えてください。
Shahryar Saljoughi

4

私がひどく間違っているlibmagic-lmagic、ImageMagickと同じライブラリでない限り。あなたはImageMagickが欲しいと述べました。

ImageMagickには、コンパイラに適切なオプションをすべて提供するユーティリティが付属しています。

例:

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

4

上記のように、リンカは探してlibmagic.soいますが、持っているのはだけlibmagic.so.1です。

この問題を解決するには、更新キャッシュを実行します。

ldconfig -v 

実行できることを確認するには:

$ ldconfig -p | grep libmagic

1

Ubuntuリポジトリからlibgl1-mesa-devをインストールすると、この問題は解決しました。


5
確かに、2008
maxpenguin

それは私の問題を解決しました。それが何であるかについてもっと情報を提供していただけませんか。そしてそれはどのようにこの問題を解決しますか?(つまり:libgl1-mesa-dev)。ありがとう
Shahryar Saljoughi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.