2017-06-11 12 views
3

私はMinGW(GCC 5.3)を使っています。-static-libstdC++はg ++では動作しますが、純粋なgccでは動作しませんか?

g++ file.cc -static-libstdc++

を持つファイルをコンパイルするときに、静的にC++標準のlib(libstdc++)をリンクし、1.9メガバイトの実行可能ファイルを生成します。

は、しかし、それはまだ動的libstdc++-6.dllにリンクし、34キロバイトの実行可能ファイルを生成

gcc -lstdc++ -static-libstdc++ file.cc

を実行しています。

なぜ-static-libstdc++g++でのみ動作しますが、純粋ではありませんgcc

+0

'-static-libstdC++'はC++のフラグです...そして 'gcc'を書くことによって、Cプログラムのリンクを指定しました –

+2

しかし、' gcc'と 'g ++'は同じものではありませんか? AFAIKの唯一の大きな違いは 'gcc'が '-lstdC++'を渡す必要があるのとは違って、 'g ++'が自動的に標準ライブラリにリンクすることです。私は 'gcc'でC++コードをコンパイルできます。 –

+0

私はこの質問が、彼らが...ではないことを実証していると思う。(それはリンクになると) –

答えて

2

GCC manual, Link Optionsは言う:

をG ++プログラムはC++プログラムをリンクするために使用される場合-static-のlibstdC++が

、それは通常、自動的にlibstdC++に対して をリンクします。 libstdC++が共有ライブラリとして使用可能で、-static オプションが使用されていない場合、これはlibstdC++の共有バージョンとリンクします。 これは通常正常です。ただし、プログラムによって使用されるlibstdC++のバージョン を完全に静的なリンクに凍結させることなくフリーズすることは時々役に立ちます。 -static-libstdC++オプションは、他のライブラリを静的にリンクすることなく、libstdC++を静的にリンクするg ++ドライバ( )に指示します。

このオプション-static-libstdc++だけに g++コンパイラドライバ、ないgccまたはその他の意味があることが明らかになります。

一方、オプション-l<name>は意味があり、同じことをすべてのGCCコンパイラドライバに対して を意味します。

gcc file.cc -lstdc++ -static-libstdc++ 

が同じ意味を持っている:驚くべきことではないその上で、これらの commandlinesの最初の動的libstdc++リンクなぜしかし

gcc file.cc -lstdc++ 

、その観察は本当に点灯しません。 -

-static-libstdc++は、g++リンクのみのため、g++に意味があります。 libstdc++が自動的に表示されます。したがって、g++の場合、質問が発生するのは かどうか自動的にlibstdc++が動的バージョン または静的バージョンにリンクされるかどうかです。動的バージョンがデフォルトです:-static-libstdc++ は静的バージョンを主張しています。g++によって

libstdc++自動リンクはこのことを意味しますg++黙っ あなたは(C++リンケージのための他のボイラープレートの かなり多くと一緒に)指定どんなリンケージオプションに-lstdc++を追加します。冗長なリンケージ(g++ ... -Wl,-v ...)を要求することにより、すべての の定型句を明らかにすることができます。

添付されている-lstdc++は、デフォルト動作として、 のlibstdc++という動的バージョンをリンカーにリンクさせます。

-Bstatic -lstdc++ -Bdynamic 

は黙っ代わりに渡されます。 -static-libstdc++によって作られた唯一の違いは、-lstdc++がそう は黙ってリンカにオプションを渡すことになる場所にいることです。

  • -Bstatic:これらは、リンカを教えて
  • -lstdc++追って通知があるまで動的ライブラリをリンクしないでください:
  • -Bdynamicリンクlibstdc++を:リンク動的ライブラリを追って通知があるまで。あなたはそれが せずに他のライブラリのリンケージの副作用をlibstdc++の静的な連携を確保するためにどのように動作するかを見

しかし、あなたはまた、libstdc++の自動連携、 動的または静的かどうかということを確認でき、は、あなたが自分でを指定した任意のライブラリのリンケージ には遡及効果がありません。したがって

あなたの結合が既に-lstdc++を含む場合、任意のボイラープレート オプションはサイレントコンパイラドライバによって付加される前、後、libstdc++リンケージ 配列におけるその位置に任意-l<name>と全く同じ方法で にリンクされます。そして静かに添付ボイラープレートオプションは環境自体によってか と、後リンクシーケンスにおける再出現-lstdc++ をもたらす場合:ライブラリーが持っているので

-Bstatic -lstdc++ -Bdynamic 

その後外観は、単に、冗長あろう は既にリンクされています。 libstdc++がリンクされ動的されているプログラムを作成

gcc file.cc -lstdc++ -static-libstdc++ 

だから、その結果gccについて特有何もありません。生成されたリンカコマンドラインの形式であるため

g++ file.cc -static-libstdc++ -lstdc++ 

:だから、確かに

g++ file.cc -lstdc++ -static-libstdc++ 

かを行い-Bstatic -lstdc++ -Bdynamicが遅すぎる

... file.o -lstdc++ ... -Bstatic -lstdc++ -Bdynamic ... 

は、任意の違いを確認します。

はそれをチェックアウト:

file.cc

#include <iostream> 

int main() 
{ 
    std::cout << "Hello World" << std::endl; 
    return 0; 
} 

コンパイルし、正常にリンクしてlddで動的な依存関係を検査する:

$ g++ -o prog file.cc 
$ ldd prog 
linux-vdso.so.1 => (0x00007ffede76a000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f42fa74c000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f42fa385000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f42fa07c000) 
/lib64/ld-linux-x86-64.so.2 (0x0000558ab42bc000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f42f9e65000) 

libstdc++.soが存在しています。ただ-static-libstdc++と今

$ g++ -o prog file.cc -static-libstdc++ 
$ ldd prog 
linux-vdso.so.1 => (0x00007fff448d7000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe5f7c71000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5f78aa000) 
/lib64/ld-linux-x86-64.so.2 (0x0000556ebf272000) 

libstdc++.soは存在しません。

そして最後に-static-libstdc++ -lstdc++

$ g++ -o prog file.cc -static-libstdc++ -lstdc++ 
$ ldd prog 
linux-vdso.so.1 => (0x00007ffd12de9000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd5a1823000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5a145c000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd5a1153000) 
/lib64/ld-linux-x86-64.so.2 (0x000055bbe31c3000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd5a0f3c000) 

libstdc++.soが帰ってきました。

(これはLinuxですが、もちろんWindowsでも同じです)。

あなたがg++gccであなたのリンケージを駆動するかどうか、

{gcc|g++} file.cc -lstdc++ ... 

libstdc++を動的にリンクされているにつながるという理由は

{gcc|g++} file.cc -lfoo ... 

は、libfooが動的にリンクさせることになるということだけであるので可能であれば、 に関係なく...にはのオプションが含まれていません。

関連する問題