単純な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とリンクしているため機能します。
しかし..
LIBRARY_PATH
は、コンパイルの前にgccによって使用され、プログラムにリンクする必要がある静的ライブラリおよび共有ライブラリを含むディレクトリを検索します。
LD_LIBRARY_PATH
は、プログラムが正常にコンパイルおよびリンクされた後にsharedライブラリを含むディレクトリを検索するために使用されます。
編集:以下に示すように、ライブラリは静的または共有にできます。静的な場合、コードはプログラムにコピーされ、プログラムをコンパイルしてリンクした後にライブラリを検索する必要はありません。ライブラリを共有する場合、ライブラリをプログラムに動的にリンクする必要があり、そのときに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を内部的に呼び出します。