web-dev-qa-db-ja.com

Ubuntu 12.04:ldがライブラリを見つけられない

Caffe( http://caffe.berkeleyvision.org/installation.html )をコンパイルしようとすると、次のエラーが発生します。

/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas

ただし、これらのライブラリがインストールされています(libatlas)。私のLD_LIBRARY_PATHにはパス/ usr/lib/atlas-baseが含まれ、ファイルlibcblas.soおよびlibatlas.so(およびその他のいくつかのファイル)が含まれています。

Ldがこれらのライブラリを見つけられないのはなぜですか?ありがとう。

13
Ran

tl; dr:Caffe makefileはlibblas.so/usr/libを探します。存在しない場合、update-alternativesは、それがインストールされている場所へのシンボリックリンク/usr/lib/libblas.soを作成します。同じことがlibcblas.soにも当てはまります。 LD_LIBRARY_PATHはランタイム用であり、これとは何の関係もありません。


LD_LIBRARY_PATHは、コンパイル時に実際には役立ちません。それらに依存するプログラムを実行するときに共有ライブラリを探すためのディレクトリを提供するだけであり、後でそれらがコンパイルされます。それでも、コンパイル中にリンクする場合、コンパイラはこれらの共有ライブラリを見つける必要があり、LD_LIBRARY_PATH以外の方法で検索します。

要点:gccまたはclangを使用してコンパイルする場合、リンクするライブラリを検索するディレクトリは-Lフラグを使用して提供され、 LD_LIBRARY_PATH環境変数。

libblas.soの一般的な場所は、/usr/lib/atlas-base//usr/lib/libblas/です。 Makefilecaffeは、これらのサブディレクトリを探して特定するために特別なことを行うものではなく、これらのライブラリがデフォルトのライブラリディレクトリ/usr/lib/にあることに依存しています。通常、シンボリックリンク/usr/lib/libblas.soが存在し、共有ライブラリの実際の場所を指します。何らかの理由で、これは初期構成には当てはまりませんでした。

パッケージの複数の選択肢を扱う場合、update-alternativesが役立ちます。 libblas.soの場合、複数の実装(libblasopenblas)を簡単に切り替えて、シンボリックリンクを変更することができます。

Sudo update-alternatives --config libblas.soは、このシンボリックリンクが見つからないときに作成しました。これにより、コンパイラーが共有ライブラリーを見つけ、問題が解決しました。これは、コマンドの出力によって示されます。

 $ Sudo update-alternatives --config libblas.so
There is only one alternative in link group libblas.so (providing /usr/lib/libblas.so): /usr/lib/libblas/libblas.so
Nothing to configure.

同じ種類の推論がlibcblas.soにも適用されます。

11
swalog

Sudo apt-get install libatlas-base-devは私のために働いた、それは両方の欠けている依存関係を取り除いた。

詳細については、このスレッドを参照してください https://github.com/BVLC/caffe/issues/559

6
Mar Cnu

実行しなければならなかったことが判明

Sudo update-alternatives --config libblas.so
Sudo update-alternatives --config liblapack.so

そしてlibatlasを選択します。なぜだかわかりません。誰かがこれを私に説明できるなら、私は彼に答えを与えます。ありがとう。

5
Ran

@Ranの回答の補足として、特にUbuntuには、Caffeで必要なもののための奇妙なパッケージ構造があります。私は自分のマシンでこの同じ問題を修正する際にこの投稿に出くわしました。 (Ubuntu 14.04)。

libatlas-devには、依存関係としてlibatlas-base-devがありません! Caffeは後者のライブラリだけが好きなようです。インストールしてください。

次に、@ Ranによって提案されたコマンドを実行し、/ usr/libの下のatlas-baseディレクトリからライブラリを選択します。 libatlas-devがインストールされているだけで、update-alternativesは@swalogの投稿の下部に出力を表示しますが、実際にはcaffeが承認しているように見えるアトラスライブラリをリンクしません! atlas-baseからのものである必要があります。お役に立てれば!

4
Drew Sabelhaus