web-dev-qa-db-ja.com

フラグ-stdlib = libstdc ++を使用する必要があるのはいつですか?

Gccでコンパイルするときに、コンパイラとリンカに-stdlib=libstdc++フラグを使用する必要があるのはいつですか?

コンパイラは自動的にlibstdc ++を使用しますか?

Ubuntu 13.10でgcc4.8.2を使用していますが、c ++ 11標準を使用したいと思います。私はすでに-std=c++11をコンパイラに渡します。

44
Raymond Valdes

Linuxの場合:一般的に、一般に利用可能なすべてのLinuxディストリビューションはデフォルトでlibstdc ++を使用し、GCCのすべての最新バージョンにはC++ 11をサポートするlibstdc ++が付属しています。ここでC++ 11コードをコンパイルする場合は、次のいずれかを使用します。

  • g++ -std=c++11 input.cxx -o a.out
  • g++ -std=gnu++11 input.cxx -o a.out

OS XでMavericksより前g++は実際にはclang++のエイリアスであり、Appleの古いバージョンのlibstdc ++がデフォルトでした。 -stdlib=libc++を渡すことにより、libc ++(c ++ 11ライブラリのサポートを含む)を使用できます。ここでC++ 11コードをコンパイルする場合は、次のいずれかを使用します。

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

OS XではMavericks以降:libc ++がデフォルトです。 -stdlib=libstdc++を渡すことにより、Appleの古いバージョンのlibstdc ++(c ++ 11ライブラリのサポートを含まない)を使用できます。

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
74
Bill Lynch

Gccでコンパイルするときに、コンパイラーとリンカーに-stdlib=libstdc++フラグを使用する必要があるのはいつですか?

短い答え:never

長い回答:-stdlibはClangフラグであり、これまでにリリースされたGCCのどのバージョンでも動作しません。 Mac OS Xでは、gccおよびg++コマンドが実際にはClangnotGCCおよびlibstdc ++のバージョンのエイリアスである場合がありますthat Apple shipsはancient(2008年頃)なので、もちろんC++ 11をサポートしていません。 OS XでClangのふりをするGCCを使用する場合、-stdlib=libc++を使用してClangの新しいC++ 11互換ライブラリを選択するか、-stdlib=libstdc++を使用してpre -博物館に属するlibstdc ++のC++ 11アンティークバージョンですが、GNU/Linuxでは、gccおよびg++は実際にはClangではなくGCCであるため、-stdlibオプションはありません。まったく働きます。

コンパイラは自動的にlibstdc ++を使用しますか?

はい、GCCは-nostdlibオプションを使用してno標準ライブラリを使用するように指示しない限り、常にlibstdc ++を使用します(この場合、どちらかが必要です)標準ライブラリ機能の使用を避けるため、または-Iおよび-Lおよび-lフラグを使用して、ヘッダーとライブラリファイルの代替セットを指すようにします。

Ubuntu 13.10でgcc4.8.2を使用していますが、c ++ 11標準を使用したいと思います。私はすでに-std=c++11をコンパイラに渡します。

他に何もする必要はありません。 GCCには、C++標準ライブラリ(libstdc ++)の独自の実装が付属しています。GCC自体と一緒に開発およびテストされるため、GCCのバージョンとlibstdc ++のバージョンは100%互換性があります。 -std=c++11でコンパイルすると、g++コンパイラーのC++ 11機能とlibstdc ++ヘッダーのC++ 11機能が有効になります。

15
Jonathan Wakely

Gccフロントエンドではなくg ++フロントエンドを使用する場合、コンパイラは自動的にlibstdc ++を使用します。

6