web-dev-qa-db-ja.com

GCC Linuxでデフォルト以外の共有ライブラリパスを指定するにはどうすればよいですか?実行中に「共有ライブラリのロード中にエラー」が発生する

ルート権限のないラップトップがあります。

マシンにconfigure --prefix=$HOME/.usrを使用してインストールされたライブラリがあります。

その後、これらのファイルを~/.usr/libに取得しました。

libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a

このコマンドでライブラリが提供する機能の1つを呼び出すプログラムをコンパイルすると:gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX

xxx.outは警告なしに生成されましたが、実行すると次のようなエラーがスローされました。

./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory、ただしlibXX.so.16は存在します。

私の手がかりのない仮定は、xxx.outが呼び出されたときに~/.usr/libが検索されなかったということです。しかし、xxx.outが.soファイルを探すために.soのパスを指定するにはどうすればよいですか?

さらに、-staticをgccにフィードすると、次のような別のエラーが発生します。

undefined reference to `function_proviced_by_the_very_librar'

.so-Lがgccに与えられていても、-lは重要ではないようです。そのライブラリで使用可能なexeをビルドするにはどうすればよいですか?


私と同じ質問をしている他の人のために

tldpの便利な記事 についてこれを見つけました。

静的/共有/動的にロードされたライブラリと、それらを使用するサンプルコードを紹介します。

54
Jokester

それを実現する方法は2つあります。

  • つかいます -rpathリンカオプション:

gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib

  • つかいます LD_LIBRARY_PATH環境変数-~/.bashrcファイル:

    export LD_LIBRARY_PATH=/home/user/.usr/lib

これは、事前に生成されたバイナリに対しても機能するため、たとえば debian.org からいくつかのパッケージをダウンロードし、バイナリと共有ライブラリをホームディレクトリに展開し、再コンパイルせずに起動できます。

簡単なテストのために、次のこともできます(少なくともbashで):

LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out

他のすべてのライブラリパスを変更しないという利点があります。

93
pelya

LIBRARY_PATHではなくLD_LIBRARY_PATHである必要があります。 gccはLIBRARY_PATHオプションで確認できる-vをチェックします

4
Ashit