共有ライブラリの「代替手段」?それは本当に機能するのでしょうか?

共有ライブラリの「代替手段」?それは本当に機能するのでしょうか?

私は、いくつかの異なる実装を持つ共有ライブラリにリンクしようとしています。具体的には、blas、openblas、atlas はすべて、/usr/lib/libblas.soUbuntu 14.04 の代替手段 (および 12.04 の類似しているが同一ではないセットアップ) を通じて同じバイナリ インターフェイスを提供します。GCC を-lblasリンカーで使用すると、代替リンクを通じて実際の実装が解決されるように見えます。たとえば、openblas がインストールされている場合、実際の openblas バイナリにリンクされ、その後、atlas がインストールされているシステムに結果の実行可能ファイルをインストールすると、代替リンクが認識されないため、動的リンカーはライブラリのロードに失敗します。

GCC で「代替」シンボリック リンクを dl ターゲットとして使用して、実際に意図したとおりに動作させる方法はありますかupdate-alternatives?

答え1

ここでは、シンボリックリンクの解決が機能です。libblas.soを に解決することでlibblas.so.3、結果の実行可能ファイルは特定の so-version に固定されます。(so-version、つまり の への変更は、ライブラリのバイナリ インターフェイスが後方互換性のない変更をしたときに発生するため、これは望ましいことです3libblas.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
    

関連情報