web-dev-qa-db-ja.com

LD_LIBRARY_PATHとLIBRARY_PATH

単純な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)マニュアルが示唆しているように、LIBRARY_PATHはGCCとリンクしているため機能します。

しかし..

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

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

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

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

188
Naveen

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

コメント からの警告:

41
F'x

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

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

11
heroxbd