質問
私はシンプルなC ++プログラムを構築しており、開発とテストのために、提供された共有ライブラリを最近のバージョンに一時的に置き換えたいと考えています。
LD_LIBRARY_PATH変数を設定しようとしましたが、リンカー(LD)に失敗しました。
/usr/bin/ld:ca n't can cont -lyaml -cpp
LD Manページによると、それが機能することを期待していました:
リンカーは、次の検索パスを使用して必要な共有ライブラリを見つけます。...ネイティブリンカーの場合、環境変数「LD_LIBRARY_PATH」の内容...
その後、ライブラリ_Pathを設定しようとしましたが、それはうまくいきました。
GCCマニュアルによると:
Library_Pathの価値は、パスによく似たディレクトリのコロン分離リストです。ネイティブコンパイラとして構成されている場合、GCCはGCC_EXEC_PREFIXを使用して見つからない場合、特別なリンカーファイルを検索するときに指定されたディレクトリを試します。 GCCを使用してリンクすると、-Lオプションの通常のライブラリを検索するときにこれらのディレクトリも使用します(ただし、-Lで指定されたディレクトリが最初に来ます)。
(GCC)マニュアルが示唆するように、GCCとリンクするため、Library_Pathが機能します。
だが..
- エラーメッセージが示唆するように、GCCとリンクしているのはなぜLDが呼ばれているのですか?
- 同じ目的に役立つ2つの変数を持っていることのポイントは何ですか?他に違いはありますか?
解決
LIBRARY_PATH
コンパイル前にGCCが使用して、プログラムにリンクする必要がある静的および共有ライブラリを含むディレクトリを検索します。
LD_LIBRARY_PATH
プログラムでは、含まれるディレクトリを検索するために使用されます 共有 ライブラリが正常にコンパイルされ、リンクされた後。
編集:以下に指摘されているように、ライブラリは静的または共有できます。静的な場合、コードはプログラムにコピーされ、プログラムがコンパイルされてリンクされた後にライブラリを検索する必要はありません。ライブラリが共有されている場合、プログラムに動的にリンクする必要があり、それが LD_LIBRARY_PATH
登場します。
他のヒント
LD_LIBRARY_PATH
プログラムが開始されると検索されます。 LIBRARY_PATH
リンク時に検索されます。
からの警告 コメント:
- ライブラリをリンクするとき
ld
(それ以外のgcc
またg++
)、LIBRARY_PATH
またLD_LIBRARY_PATH
環境変数は読み取られません。 - ライブラリをリンクするとき
gcc
またg++
, 、LIBRARY_PATH
環境変数は読み取られます(参照 ドキュメンテーション "gcc
通常のライブラリを検索するときにこれらのディレクトリを使用します」).
エラーメッセージが示唆するように、GCCとリンクしているのはなぜLDが呼ばれているのですか?
GCCは、リンクモードの場合、LDを内部的に呼び出します。