ルート権限のないラップトップがあります。
マシンに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の便利な記事 についてこれを見つけました。
静的/共有/動的にロードされたライブラリと、それらを使用するサンプルコードを紹介します。
それを実現する方法は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
他のすべてのライブラリパスを変更しないという利点があります。
LIBRARY_PATH
ではなくLD_LIBRARY_PATH
である必要があります。 gccはLIBRARY_PATH
オプションで確認できる-v
をチェックします