2017-10-26 8 views
2

ローカルにインストールされた共有ライブラリ(./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にあります。

答えて

1

それはあなたが標準以外の場所/what/ever/vendor/libに 共有ライブラリをインストールした後ldconfigキャッシュを更新していない可能性が高いの音: - あなたが実行時リンカーはlibfoo.soことに気づかないだろうことをやるまでは

sudo ldconfig /what/ever/vendor/lib 

実行時に LD_LIBRARY_PATH環境変数でプロンプトを表示しない限り、 は/what/ever/vendor/libになります。

-rpathを認識していないということは、ご使用のバージョンg++の欠点ではありません。これはリンカー(ld)オプション、 のGCCフロントエンドオプションではありませんでした。だから、-Wl,-rpath=/what/ever/vendor/libldconfigキャッシュまたは外のそれがより良いと考えることができる通常のリンケージについてはLD_LIBRARY_PATH

のいずれかに頼って回避するように、あなたの プログラムへの非標準のランタイム・ライブラリー・パスを仮止めする 従来の方法であります差異の少ない効果があるldconfigキャッシュを拡張するのではなく、-rpath を使用してください。

+0

"実行時リンカーは、' libfoo.so'が '/ what/ever/vendor/lib'にあることに気づかないでしょう。" - そう、そのため、バイナリを絶対パスでコンパイルしたかったのです'ld.so'はそれを検索する必要はありません(私はスーパーユーザ権限を持っていません)。しかし、私は '-rpath'が従来の解決策であることを見ています。私は 'ld'が明示的に絶対パスを使用するのをなぜ無視するのだろうというのは困惑しています。 –

関連する問題