添付されている-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
が動的にリンクさせることになるということだけであるので可能であれば、 に関係なく...
にはのオプションが含まれていません。
'-static-libstdC++'はC++のフラグです...そして 'gcc'を書くことによって、Cプログラムのリンクを指定しました –
しかし、' gcc'と 'g ++'は同じものではありませんか? AFAIKの唯一の大きな違いは 'gcc'が '-lstdC++'を渡す必要があるのとは違って、 'g ++'が自動的に標準ライブラリにリンクすることです。私は 'gcc'でC++コードをコンパイルできます。 –
私はこの質問が、彼らが...ではないことを実証していると思う。(それはリンクになると) –