184

単純な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つの変数を持つことのポイントは何ですか?他に違いはありますか?
4

4 に答える 4

242

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

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

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

于 2010-11-22T22:09:44.183 に答える
55

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

コメントからの警告:

于 2010-11-27T20:13:54.330 に答える
13

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

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

于 2011-12-02T00:36:44.453 に答える
0

LIBRARY_PATHはリンカー(ld)によって使用されます

LD_LIBRARY_PATHはローダー(ld.so)によって使用されます

于 2021-11-04T09:48:46.873 に答える