私はこの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
にシンボリックリンクすることです。
Grepsedawkによって定式化されたように、答えはld
を呼び出す-l
のg++
オプションにあります。このコマンドのmanページを見れば、次のどちらかを実行できます。
g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
共有ライブラリをそれらのランタイムコンポーネント(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
のようなコンパイルに必要な他のファイルもあなたに与えるでしょう。
Ubuntuでは、ライブラリを自動的に解決するlibtool
をインストールできます。
$ Sudo apt-get install libtool
これは私にとってltdl
に関する問題を解決しました。これはlibltdl.so.7
としてインストールされていて、makeで単に-lltdl
として見つけられませんでした。
libmagic
や-lmagic
がImageMagickと同じライブラリではないと誤解しない限り。あなたはあなたがImageMagickが欲しいと言います。
ImageMagickには、コンパイラにすべての適切なオプションを提供するためのユーティリティが付属しています。
例:
g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
前述のように、リンカはlibmagic.so
を探していますが、あなたはlibmagic.so.1
しか持っていません。
この問題を解決するには、更新キャッシュを実行するだけです。
ldconfig -v
実行できることを確認するには
$ ldconfig -p | grep libmagic
Ubuntuリポジトリからlibgl1-mesa-devをインストールすることで、この問題は解決しました。