0

CentOS 6.2 (デフォルトで gcc 4.4.6 の 64 ビット) を使用しています。残念ながら、私のコードは gcc 3.4.6 でしかコンパイルできないため、gcc を (ソースから) /home/rajat/local の下に個別にインストールしました。単純な「Hello World」プログラムをリンクすると、次のようになります。

>ldd a.out 
linux-vdso.so.1 =>  (0x00007fff215ff000)
libstdc++.so.6 => /home/rajat/local/lib64/libstdc++.so.6 (0x00007f11853e7000)
libm.so.6 => /lib64/libm.so.6 (0x00000033be400000)
libgcc_s.so.1 => /home/rajat/local/lib64/libgcc_s.so.1 (0x00007f11851ce000)
libc.so.6 => /lib64/libc.so.6 (0x00000033bd000000)
/lib64/ld-linux-x86-64.so.2 (0x00000033bcc00000)

stdc++ と gcc は私の 3.4.6 ライブラリにリンクしていますが、libm と libc はデフォルトのライブラリにリンクしています。これでよろしいですか??3.4.6 のインストールでも libm または libc ライブラリが生成されませんでしたか?

4

2 に答える 2

2

はい、大丈夫です。

libc/libm は、gcc コンパイラではなく、glibc の一部です。一方、libstdc++ は gcc の一部です。

于 2012-06-28T07:58:09.037 に答える
1

のライブラリと/libそれ/usr/libに対応する64ビットのライブラリは、システム全体のライブラリです。それらはコンパイラニュートラルであると想定されており、GCC以外の他のコンパイラもそれらにリンクでき、特にlibcオペレーティングシステムカーネルとインターフェイスする唯一のポータブルな方法であるため、実際にリンクできます。

libcライターは、ライブラリ内のコードと適切にインターフェイスするために、異なるコンパイラが同じバイナリメモリオブジェクトを生成するようにヘッダーファイルを作成することに細心の注意を払っています。さらに、相互に互換性を保つためにすべてのコンパイラが準拠する、明確に定義されたOSABIインターフェイスがあります。これは、C以外の言語には当てはまらない場合があります。たとえば、異なるC++コンパイラバージョンのオブジェクトファイルが互いにうまく機能することはめったにありません。

コンパイラ固有のライブラリはにインストールされておらず、依存関係を削除できるように静的にリンクできる場合もあります/lib/usr/lib

于 2012-06-28T08:08:13.447 に答える