libfooのバージョン名があるがlibfoo.soがない場合 -lfooとリンクする方法

libfooのバージョン名があるがlibfoo.soがない場合 -lfooとリンクする方法

libfooが含まれているとします/usr/lib/x86_64-linux-gnu/

  • libfoo.so.2-> libfoo.so.2.0.0(シンボリックリンク)
  • libfoo.so.2.0.0

特に抜けたのはlibfoo.so

/usr/local/bin/sillyprogこのようなものを使うプログラムがあるとしましょうgcc somefile.c -lfoo。それを使用しようとするたびにそれがないのでsillyprog失敗します。/usr/bin/ld: cannot find -lfoolibfoo.so

その中にあるファイルを編集する権限がないと仮定すると、実行時に/usrlibfooを正常に関連付けるためにどのような回避策を使用できますかsillyprog

答え1

1つのオプションは、制御するディレクトリに正しい名前を持つライブラリへのリンクを作成することです。その後、LIBRARY_PATH環境LD_LIBRARY_PATH変数を使用してこのディレクトリを指すことができます。これらの変数は、プログラムをコンパイルまたは実行するときにリンカとローダがそれぞ​​れライブラリを見つける場所に影響します。 ~によるとGCCドキュメント:

値はLIBRARY_PATH、同様にコロンで区切られたディレクトリのリストですPATH。デフォルトのコンパイラとして設定されている場合、GCCは特別なリンカファイルを検索するときにGCC_EXEC_PREFIXGCCとリンクするときにこれらのディレクトリを検索するときに指定されたディレクトリを試みます。通常のライブラリオプションを使用する場合も使用されます -l(ただし、指定されたディレクトリを-L最初に使用します)。

したがって、次のようになります。

mkdir -p ~/.local/lib
ln -s /usr/lib/x86_64-linux-gnu/libfoo.so.2 ~/.local/lib/libfoo.so

その後、コンパイルに使用されたプログラムを実行しますlibfoo.so

LIBRARY_PATH=~/.local/lib sillyprog

または、独自にリンクされたプログラムを実行してくださいlibfoo.so

LD_LIBRARY_PATH=~/.local/lib sillyprog

関連情報