0

現在、外部のダイナミックライブラリにリンクされていないC++のプロジェクトがあります。将来、ビルドする必要のあるいくつかのBoostライブラリを使用することを考えています(ヘッダーのみではありません)。今のところ、開発の段階で、3つの異なるツールチェーンを使用してプロジェクトを構築します。 g++、、LLVM/Clang++およびIntel C++、プラットフォームはLinuxです。これらのコンパイラ、AFAIKは、相互にバイナリ互換です。たとえば、g++でコンパイルされたアプリはIntelC++でコンパイルされたダイナミックライブラリを使用できます。

ブーストバイナリを作成し、別のフォルダにインストールしました。例build_gccbuild_icc。次に、これらのフォルダへのパスをシステムに追加しましたLIBRARY_PATH。問題は、プロジェクトをg++またはでビルドし、Intel C++ダイナミックライブラリをリンクする場合です。

-lboost_math_tr1

で、makefileリンカは、異なるコンパイラのバイナリが相互に互換性がある場合に、リンクする正確なライブラリファイルをどのように決定しますか?

質問の動機は単純です。最適化コンパイラであるため、それを使用してビルドする場合、。でコンパイルされたものではなく、コンパイラでIntel C++コンパイルされたダイナミックライブラリに対してリンクされることを期待します。もちろん、で複数の条件ステートメントを使用して、使用するツールチェーンごとにライブラリバイナリを含む正確なディレクトリを設定できることは知っていますが、少し不便です。私はさまよっています、リンカーはそれが使用すべき正確な共有ライブラリファイルを認識するのに十分賢いですか、それとも単にシステムで最初に見つかったものを使用しますか?Intel C++g++makefileLIBRARY_PATH

4

3 に答える 3

1

リンカは知りません。最初に見つかったライブラリに互換性がない場合は、互換性のあるライブラリが見つかるまですべてのライブラリを検索するのではなく、ベイルアウトします。

次のようなことを確認します。

$ cat foo.c
int main() {
  return 0;
}
$ mkdir bar
$ touch bar/libm.so
$ gcc foo.c -o foo -Lbar -lm
/usr/bin/ld: error: b/libm.so: file is empty
collect2: error: ld returned 1 exit status

otoh、ダイナミックリンクの美しさは、再コンパイルすることなく、dylibをより良いものと交換できることにあります。したがって、g ++バージョンに対してリンクすることはできますが、パフォーマンスが低い場合は、ターゲットホスト(g ++バージョンの前に検索される場所)にiccバージョンをインストールすると、アプリケーションは魔法のようにそれを使用します(互換性)。

アプリケーションの実行時に、変数を使用LD_LIBRARY_PATHして非標準の場所にあるライブラリを検索することもできます。

LD_LIBRARY_PATH=/path/to/super/libs/ ./app-dylinked-with-generic-libs
于 2012-10-03T14:00:03.260 に答える
0

PATH環境変数は、ライブラリの検索ではなく、実行可能ファイルの検索に使用されます。各コンパイラには、ライブラリを検索する一連の標準の場所と、-Lを使用して明示的に指定された場所があります。どのコンパイラがライブラリを作成したかは気にしません。

于 2012-10-03T13:56:48.240 に答える
0

$LIBRARY_PATHこれらのライブラリは、ではなく(リンク)と$LD_LIBRARY_PATH(ランタイム)に追加する必要があります$PATHMakefileこれらの変数を一度に1つずつ設定して、リンクするバイナリを決定できるように感じます。

于 2012-10-03T13:56:58.317 に答える