web-dev-qa-db-ja.com

既存のライブラリが見つかりません

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

この問題をさらに詳しく診断するにはどうすればよいですか。また、何が問題なのでしょうか。私は完全に愚かなことをしていますか?

160
maxpenguin

問題は、リンカがlibmagic.soを探しているが、あなたはlibmagic.so.1しか持っていない

手っ取り早い方法は、libmagic.so.1libmagic.soにシンボリックリンクすることです。

150
grepsedawk

Grepsedawkによって定式化されたように、答えはldを呼び出す-lg++オプションにあります。このコマンドのmanページを見れば、次のどちらかを実行できます。

  • g++ -l:libmagic.so.1 [...]
  • libsパスにlibmagic.soというシンボリックリンクがある場合はg++ -lmagic [...]
65
Piotr Lesnicki

共有ライブラリをそれらのランタイムコンポーネント(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を検索します。これが開発に必要な理由です。

これがLinuxでどのように機能するかについての詳細は、 Diego E.Pettenò:リンカーと名前 を参照してください。


一言で言えば、あなたはapt-get install libmagic-devでなければなりません。これはlibmagic.soだけでなく、/usr/include/magic.hのようなコンパイルに必要な他のファイルもあなたに与えるでしょう。

31
ephemient

Ubuntuでは、ライブラリを自動的に解決するlibtoolをインストールできます。

$ Sudo apt-get install libtool

これは私にとってltdlに関する問題を解決しました。これはlibltdl.so.7としてインストールされていて、makeで単に-lltdlとして見つけられませんでした。

7
Mr Ed

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

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

1
kirenpillay