私は、いくつかの異なる実装を持つ共有ライブラリにリンクしようとしています。具体的には、blas、openblas、atlas はすべて、/usr/lib/libblas.so
Ubuntu 14.04 の代替手段 (および 12.04 の類似しているが同一ではないセットアップ) を通じて同じバイナリ インターフェイスを提供します。GCC を-lblas
リンカーで使用すると、代替リンクを通じて実際の実装が解決されるように見えます。たとえば、openblas がインストールされている場合、実際の openblas バイナリにリンクされ、その後、atlas がインストールされているシステムに結果の実行可能ファイルをインストールすると、代替リンクが認識されないため、動的リンカーはライブラリのロードに失敗します。
GCC で「代替」シンボリック リンクを dl ターゲットとして使用して、実際に意図したとおりに動作させる方法はありますかupdate-alternatives
?
答え1
ここでは、シンボリックリンクの解決が機能です。libblas.so
を に解決することでlibblas.so.3
、結果の実行可能ファイルは特定の so-version に固定されます。(so-version、つまり の への変更は、ライブラリのバイナリ インターフェイスが後方互換性のない変更をしたときに発生するため、これは望ましいことです3
。libblas.so.3
問題は、ターゲット システムに がないことであると思われるのでlibblas.so.3
、次のことをお勧めします。
- アプリケーションが
libblas.so.3
既に にリンクされていることを確認してください。 ターゲット システムで、実際の 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