1. ホーム
  2. gcc

[解決済み] LD_LIBRARY_PATH と LIBRARY_PATH の比較

2022-03-03 09:04:45

質問

簡単なC++プログラムを作っているのですが、開発・テストのために、システム提供の共有ライブラリを一時的に最新版に置き換えたいのですが、どうすればいいですか?

LD_LIBRARY_PATH 変数を設定してみましたが、リンカー (ld) は次のように失敗しました。

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

ldのmanページによると、私はそれが動作することを期待した。

リンカは以下の検索を使用します。 パスで必要な共有 ライブラリ: ... ネイティブリンカーの場合。 環境変数 "LD_LIBRARY_PATH"...

その後、LIBRARY_PATHを設定してみたところ、うまくいきました。

GCCのマニュアルによると

の値は LIBRARY_PATH はコロンで区切られたリストです。 というように、ディレクトリを指定します。このとき ネイティブコンパイラとして設定されたGCCは は、このように指定されたディレクトリを試行します。 特殊リンカー を使っても見つからない場合は gcc_exec_prefix. GCC を使ってリンクする は、これらのディレクトリを使用します。 のために通常のライブラリを検索します。 l オプション(ただし、ディレクトリ Lで指定されたものが優先されます)。

(GCC)マニュアルにあるように、GCCでリンクするので、LIBRARY_PATHが機能します。

でも...

  • gccでリンクしているので、なぜldが が呼び出されます。 が示唆しているのでしょうか?
  • 何のために 2つの変数が同じ役割を果たす の目的は?他に の違いは何ですか?

解決方法は?

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

LD_LIBRARY_PATH を含むディレクトリを検索するために使用されます。 共有 のライブラリが正常にコンパイル・リンクされたことを示します。

EDIT 下記で指摘されているように、ライブラリは静的または共有にすることができます。もし静的ライブラリであれば、そのコードはプログラムにコピーされるので、プログラムがコンパイルされリンクされた後、ライブラリを探す必要はありません。共有ライブラリの場合は、プログラムに動的にリンクする必要があり、その際に LD_LIBRARY_PATH が登場します。