共有ライブラリの「代替」?これはまだ有効ですか?

共有ライブラリの「代替」?これはまだ有効ですか?

いくつかの実装がある共有ライブラリをリンクしようとしています。具体的には、blas、openblas、およびatlasはすべて/usr/lib/libblas.soUbuntu 14.04の代替を介して同じバイナリインタフェースを提供します(12.04のように同じではありません)。リンカーでGCCを使用すると、-lblas実際には代替リンクを介して実際の実装で解決されるようです。たとえば、openblasをインストールすると実際のopenblasバイナリにリンクされ、ビルドをインストールするとmy system atlasがインストールされている実行可能ファイルの場合、動的リンカーは代替リンクを表示できないため、ライブラリをロードできません。

GCCが「代替」シンボリックリンクをdlターゲットとして使用して、実際に期待どおりに機能するようにする方法はありますかupdate-alternatives

答え1

シンボリックリンクの確認はここの機能です。libblas.soとして解析すると、生成されたlibblas.so.3実行可能ファイルは特定のsoバージョンに固定されます。 (soバージョンへの変更は、ライブラリのバイナリインターフェイスが以前のバージョンと互換性がないように変更されたときに発生するため、3これは予想されます。libblas.so.3

問題はターゲットシステムにないようですlibblas.so.3。したがって、以下を提案します。

  1. libblas.so.3あなたのアプリケーションが接続されていることを確認してください。
  2. ターゲットシステムで実際のlibblas.soから目的の名前のシンボリックリンクを作成し、libblas.so.3このシンボリックリンクがLD_LIBRARY_PATHに見つかるようにします。

    mkdir ./mylib
    ln -s /usr/lib/libblas.so ./mylib/libblas.so.3
    LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable
    

関連情報