ATLAS
DockerイメージにNetlibを使用してインストールしましたが、LAPACK
実行するたびにldconfig
次のエラーが発生します。
ldconfig: Can't link /usr/local/lib//usr/local/lib/libtatlas.so to libtatlas.so
ldconfig: Can't link /usr/local/lib//usr/local/lib/libsatlas.so to libsatlas.so
もちろん、存在しないがシンボリックリンクではない/usr/local/lib//usr/local/lib/libtatlas.so
ので、なぜこのファイルを見つけようとするのか混乱しています。libtatlas.so
root@cd00953552ab:/usr/local/lib# ls -la | grep atlas
-rw-r--r-- 1 root staff 15242054 Apr 27 08:18 libatlas.a
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libatlas.so
-rwxr-xr-x 1 root staff 17492184 Apr 27 08:18 libsatlas.so
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libtatlas.so
なぜこれが起こり、これを解決したり、このエラーメッセージをオフにしたりする方法はありますか?
編集:これはReadelf出力です。
root@cd00953552ab:/usr/local/lib# eu-readelf -a /usr/local/lib/libatlas.so | grep SONAME
SONAME Library soname: [/usr/local/lib/libtatlas.so]
答え1
何らかの理由で、おそらくライブラリの構築方法(より具体的にリンクされている)に関してインストールディレクトリをsonameに保存します。したがって、 libtatlas.so
sonameです/usr/local/lib/libtatlas.so
。ldconfig
同じディレクトリにある対応するsoname(存在しない場合)にライブラリをリンクしてみてください。ライブラリを探し、対応するsonameを確認し、/usr/local/lib/libtatlas.so
(ディレクトリとsoname接続)でリンクを作成する必要があるかどうかを判断し、存在しないため失敗します。/usr/local/lib//usr/local/lib/libtatlas.so
/usr/local/lib/libtatlas.so
/usr/local/lib/usr/local/lib
この問題を解決する適切な方法は、ライブラリの名前が正しく定義されていることを確認することです。通常、ディレクトリ名などはないと予想します。libtatlas.so.3
(バージョンはビルドしているライブラリのABIレベルによって異なります。)ライブラリを再構築するか、正しくビルドされたパッケージを見つける必要があります。
あるいは、編集ライブラリのsonameを使用することもできます。パッチELF:
patchelf --set-soname libtatlas.so /usr/local/lib/libtatlas.so
理想的には、このライブラリで構築されたプログラムを再リンクする必要があります。これにはsonameも含まれています(PatchELFを使用してパッチを適用することもできます)。
進化しているシステムではsonameにバージョンを付けたいのですが、コンテナではこれは重要ではないかもしれません。とにかく、アップグレードのためにコンテナを再構築する必要があります。
答え2
BLASライブラリの特別なケースですATLAS
。実際の原因に対する解決策は、パッケージの構築に使用されたmakefileを修正することです。
理由については@Stephen Kittの回答をご覧ください。
しかし--set-soname エラーでは、patchelf
patchelfソリューションは機能しません。
あなたのライブラリパスには「/usr/local」が含まれているので、ソースからビルドされたとします。
ソースコードのルートがあるファイルを確認してください$(SRC)/makes/Make.lib
。$(SRC)
具体的には、次の行は次のようになります。
LDTRY:
$(LD) $(LDFLAGS) -shared -soname $(LIBINSTdir)/$(outso) -o $(outso) \
-rpath-link $(LIBINSTdir) \
--whole-archive $(libas) --no-whole-archive $(LIBS)
ここの名前が間違っています-soname $(LIBINSTdir)/$(outso)
。これを変更して-soname $(outso)
ライブラリを再構築すると、問題が解決しました。
正常にビルドしたら、その行を変更してください$(BUILD)/lib/Makefile
。ここでは$(BUILD)
、ライブラリが構築されたディレクトリです。その後、make shared
ライブラリを構築します。
などのコマンドを使用して、生成されたreadelf -d libtatlas.so | grep soname
.soファイルでsonameを確認します。目次セクションを含めないでください。
正しいmakefileが見つからない場合(たとえば、異なるバージョンのmakefileを使用している場合ATLAS
)、grep -IR soname
変更する場所を見つけてください。