7

g++ がリンク先の libstdc++ のバージョンを選択する方法と、ライブラリの「システム」バージョンが異なる場合の意味を理解しようとしています。

私は gcc/g++ 4.1.2 を使用しています。これには、ABI ガイドラインのドキュメントによると、libstdc++.so.6.0.8 が含まれています。

-rwxr-xr-x  1 root root 4397810 May 18  2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8

ABI の前方互換性に関する私の理解に基づいて、g++ 4.1.2 でビルドし、6.0.8 より後のバージョンの libstdc++ を使用するシステムでコードが実行されることを期待できますが、以前のバージョンのシステムでは実行されません。古いバージョンの ABI が含まれます。

同じマシンの /usr/lib には古いバージョンの libstdc++ があります。

-rwxr-xr-x  1 root root 804288 Jul 22  2005 /usr/lib/libstdc++.so.6.0.3

このマシンで g++ 4.1.2 を使用してコードをコンパイルし、それを ldd すると、参照されている /usr/lib の libstdc++ のバージョンが 6.0.3 であることがわかります。

# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.

/usr/lib が最初にチェックされるため、これは予期されることです。そして、アプリケーションは正常に動作します。

私の質問は、ここで何が起こったのですか?

g++ 4.1.2 は、そのリリース (6.0.8) の一部である libstdc++.so のバージョンに対してリンクされていますか? もしそうなら、実行可能ファイルが実行時に /usr/lib の古いバージョンを使用できるのはなぜですか?それには古い ABI があります。幸運?

または、g++ 4.1.2 はリンク時に libstdc++ (6.0.3) の /usr/lib バージョンを取得してそれを使用しましたか?実行時に実行可能ファイルと同じ方法でライブラリ パスを解決するからです。libstdc++ が「独自の」バージョンでなくても、g++ はそれを行うことができますか? g++4.1.2 (6.0.8) の libstdc++ バージョンの目的は何ですか? このプロセスでまったく使用されましたか?

任意の洞察をいただければ幸いです。

4

2 に答える 2

9

GCC は、ディレクトリ検索リストに従ってすべてのライブラリを選択します。次のように表示できます。

gcc -print-search-dirs

リストは通常​​、コンパイラのバージョンに固有のライブラリを優先します (存在する場合)。

ただし、リンク時の選択は実行時の選択と同じではない場合があります。

リンカー コマンドに-rpathオプションが含まれている場合 (一部のツールチェーン ベンダーには非標準オプションが含まれている場合があります)、ダイナミック リンカーはそれを使用して、実行時に適切なライブラリを見つけます。それ以外の場合、システムはデフォルトのライブラリを使用します。

2 つのライブラリがうまく一致しない場合、問題が発生する可能性があります。C ライブラリ (通常は glibc) は、互換性を維持するために常に注意を払ってきました。C++ ライブラリには、常にこの贅沢があったわけではありません。近年はより安全になっていますが、多くの人はまだ混同しないことを推奨しています.

于 2013-05-29T10:46:37.803 に答える
1

デフォルトでは、gcc は /usr/lib パスにあるライブラリを使用します。
1. gcc/g++ 4.1.2 は libstdc++.so.6.0.8 の最新バージョンにリンクされていません。
2. g++ 4.1.2 は、リンク時に libstdc++ (6.0.3) の /usr/lib バージョンを選択しました。

ライブラリ パスを明示的に設定しない限り、システム デフォルトの libstdc++.so.6.0.3 が引き続き使用されます。

gcc/g++ 4.1.2 の場合、最新バージョンの libstdc++.so.6.0.8 を使用するには、コンパイルする前にライブラリ パスをエクスポートする必要があります。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib

gcc/g++ 4.1.2 を使用してリンクすると、libstdc++.so.6.0.8 が使用されます。

于 2013-06-04T17:38:11.063 に答える