ローカルにインストールされた共有ライブラリ(./vendor/lib/libfoo.so
)をバイナリの./bar
にリンクしようとしています。残念ながら、私の試みのどれも絶対パスがlibfoo.so
のリンクを生成しません。結果として、私は私が避けしたい、それを実行するためにLD_RUN_PATHを使用しない共有ライブラリの絶対パスを強制する
LD_LIBRARY_PATH=vendor/lib ./bar
を使用する必要があります。
linux-vdso.so.1 => (0x00007ffed5fd8000)
libbar.so.2 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb9ea787000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb9ea47d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb9ea267000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb9e9e9d000)
/lib64/ld-linux-x86-64.so.2 (0x000055f326761000)
についてlibbar.so.2
単語:ファイルがlibbar.so
と一緒に(vendor/lib
に)存在するldd bar
は私にこのことを示しています。どちらも実際にlibhts.so.1.6
へのシンボリックリンクです。そのファイルも存在し、実際の共有ライブラリです。
ここで私が試したさまざまな方法があります:これらの変異体の
FULL_PATH="$(pwd -P)/vendor/lib"
g++ -o bar bar.o -Lvendor/lib -lfoo # 1
g++ -o bar bar.o -L$FULL_PATH -lfoo # 2
g++ -o bar bar.o $FULL_PATH/libfoo.so # 3
g++ -o bar bar.o $FULL_PATH/libfoo.so.1.6 # 4
すべてが同一ldd
出力を生成し、でも最後の行は(ld
は、ライブラリの最新バージョンを使用して主張していますか? )。
私はこの仕事をするために見つけた唯一の方法は、(g++
の私のバージョンは、この引数を理解していないので、私は-rpath
を使用することはできません、と私はg++
を使用してい
LD_RUN_PATH=$FULL_PATH g++ -o bar bar.o -Lvendor/lib -lfoo
を使用することです。私はもちろんの-Wl,-rpath
を使用することができます)
しかし、私は助けるが、環境変数/ -rpath
を使用せずに、この作品を作る方法があるべきだと感じることができない - 代わりにld
ののlibstdC++依存性が権利を取得します。私はan answer specifically referencing symlinks to librariesを見つけましたが、残念ながらそれは私を助けません(上記の試み4を参照)。
これは重要な場合に備えて、Ubuntu 16.04、g ++ 5.4.0、GNU ld 2.26.1にあります。
"実行時リンカーは、' libfoo.so'が '/ what/ever/vendor/lib'にあることに気づかないでしょう。" - そう、そのため、バイナリを絶対パスでコンパイルしたかったのです'ld.so'はそれを検索する必要はありません(私はスーパーユーザ権限を持っていません)。しかし、私は '-rpath'が従来の解決策であることを見ています。私は 'ld'が明示的に絶対パスを使用するのをなぜ無視するのだろうというのは困惑しています。 –