LD_LIBRARY_PATHとLIBRARY_PATH


159

単純なC ++プログラムを構築しています。開発とテストのために、システム提供の共有ライブラリを一時的に最新バージョンのライブラリに置き換えたいと考えています。

LD_LIBRARY_PATH変数を設定しようとしましたが、リンカー(ld)は次のエラーで失敗しました:

/ usr / bin / ld:-lyaml-cppが見つかりません

ld manページによると、私はそれが機能することを期待していました:

リンカーは次の検索パスを使用して、必要な共有ライブラリを見つけます。...ネイティブリンカーの場合、環境変数「LD_LIBRARY_PATH」の内容...

次に、LIBRARY_PATHを設定してみましたが、うまくいきました。

GCCマニュアルによると:

LIBRARY_PATHの値は、PATHによく似た、コロンで区切られたディレクトリのリストです。ネイティブコンパイラとして構成されている場合、GCCは、GCC_EXEC_PREFIXを使用してそれらを見つけることができない場合、特別なリンカーファイルを検索するときに指定されたディレクトリを試みます。GCCを使用したリンクでも、-lオプションの通常のライブラリを検索するときにこれらのディレクトリが使用されます(ただし、-Lで指定されたディレクトリが最初に来ます)。

(GCC)マニュアルに示されているように、GCCとリンクしているため、LIBRARY_PATHが機能します。

だが..

  • エラーメッセージが示唆するように、私はgccとリンクしているので、なぜldが呼び出されていますか?
  • 2つの変数が同じ目的を果たしている意味は何ですか?他に違いはありますか?

回答:


213

LIBRARY_PATH プログラムにリンクする必要のある静的ライブラリおよび共有ライブラリを含むディレクトリを検索するために、コンパイル前にgccによって使用されます。

LD_LIBRARY_PATHコンパイルとリンクが正常に行われた後、共有ライブラリを含むディレクトリを検索するためにプログラムで使用されます。

編集:以下に示すように、ライブラリは静的または共有にすることができます。静的な場合、コードはプログラムにコピーされ、プログラムがコンパイルおよびリンクされた後にライブラリを検索する必要はありません。ライブラリが共有されている場合は、ライブラリをプログラムに動的にリンクする必要があり、そのときLD_LIBRARY_PATHに機能します。


14
そしてもちろん、LD_LIBRARY_PATHは動的ライブラリでのみ意味があります
Alex Jasmin

2
私のポイントは、リンクに(直接)ldを使用する場合、ldマニュアルによると、LD_LIBRARY_PATHを使用して、プログラムにリンクする必要のあるライブラリを含むディレクトリを検索することでした。私はここで何かが欠けする必要があります...
ゲオルギオスPolitis

2
ldを自分で呼び出してオブジェクトファイルをライブラリと組み合わせない限り、gccが渡すパスが「継承」されます。-Xlinkerオプションを使用して、標準のgccをオーバーライドできます。
Naveen

5
実際にLIBRARY_PATH は、静的ライブラリのみではなく、静的および動的ライブラリを含むディレクトリの検索に使用されます。
particle128

3
うん、これは間違っている-の違いはそれがあるLIBRARY_PATHのライブラリ(静的または動的)が検索され、コンパイル時LD_LIBRARY_PATH実行時に動的ライブラリを検索します。もちろん、実行時に静的ライブラリを検索する必要はありません。
Timmmm

47

LD_LIBRARY_PATHプログラムの起動LIBRARY_PATH時に検索され、リンク時に検索されます。

コメントからの警告:


38
注:ライブラリをリンクする場合ld、それ自体はLIBRARY_PATHまたはでライブラリを検索しませんLD_LIBRARY_PATH。ときだけだgcc呼び出すがld、そのLIBRARY_PATH使用になります。(これを難しい方法で学習しました。)
Rufflewind

1
@Rufflewind興味深いですが、参考にしておけばさらに良かったでしょう。
hmijailが辞任者を悼む2016

このビューは、ライブラリが検索される瞬間(リンク時と実行時)を区別し、@ Naveenは、検索されるライブラリのタイプ(静的v動的)を区別します。2つのビューが実質的に同一であるか(動的:実行時=静的:リンク時)、またはこの対応が成立しない重要な状況はありますか?動的ライブラリについての知識はコンパイル時にも必要だと思います。
XavierStuvw 2018年

13

エラーメッセージが示唆するように、私はgccとリンクしているので、なぜldが呼び出されていますか?

リンクモードのとき、gccはldを内部的に呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.