gccでコンパイルする際に、コンパイラとリンカにフラグ-stdlib=libstdc++
を使用する必要があるのはどのような場合ですか?
コンパイラは自動的にlibstdc++を使用しますか。
Ubuntu 13.10でgcc4.8.2を使用していますが、c++11規格を使用したいと考えています。コンパイラにはすでに-std=c++11
を渡しています。
Linuxの場合。一般的に、一般的に入手可能なすべてのLinuxディストリビューションは、デフォルトでlibstdc++を使用し、すべての最新バージョンのGCCは、C++11をサポートするlibstdc++が付属しています。 ここでc++11コードをコンパイルしたい場合は、以下のいずれかを使用してください。
Mavericks以前のOS Xの場合__: g++
は実際にはclang++
のエイリアスで、Apple'の古いバージョンのlibstdc++がデフォルトでした。また、-stdlib=libc++
とすることで、libc++ (c++11 ライブラリのサポートを含む) を使用することができました。ここでc++11のコードをコンパイルしたい場合は、次のいずれかを使用してください。
g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
(clang, not GNU compiler!)clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
(clang, not GNU compiler!)clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
です。Mavericks以降のOS Xでは、デフォルトでlibc++が使用されます。Apple'の古いバージョンのlibstdc++(c++11ライブラリのサポートが含まれていない)を使用するには、-stdlib=libstdc++
を渡します。
clang++ -std=c++11 input.cxx -o a.out
とします。clang++ -std=gnu++11 input.cxx -o a.out
です。gccでコンパイルするときに、コンパイラとリンカに-stdlib=libstdc++
というフラグを使う必要があるのはどんなときですか?
答えは以下の通りです。決してありません。
長い答えです。-stdlibはClangのフラグであり、これまでにリリースされたどのバージョンのGCCでも動作しません。Mac OS Xでは、
gccや
g++コマンドは、実際には**GCCではなく**Clangのエイリアスであることがあり、Appleが出荷しているlibstdc++のバージョンは**古い**(2008年頃)なので、当然C++11をサポートしていません。つまり、OS XでClang-pretending-to-be-GCCを使う場合、
-stdlib=libc++を使ってClang's new C++11-compatible libraryを選択するか、
-stdlib=libstdc++を使って博物館にあるC++11以前の古めかしいバージョンのlibstdc++を選択することができます。しかし、GNU/Linuxでは、
gccと
g++は実際にはClangではなくGCCなので、
-stdlib`オプションは全く機能しません。
コンパイラは自動的にlibstdc++を使用しますか?
はい、GCCは常にlibstdc++を使用します。ただし、-nostdlib
オプションで**標準ライブラリを全く使用しないように指示した場合は別です(その場合は、標準ライブラリの機能を使用しないようにするか、-I
や-L
、-l
フラグを使用して、代替のヘッダファイルやライブラリファイルのセットを指定する必要があります)。
gcc4.8.2をUbuntu 13.10で使用していますが、c++11規格を使用したいと考えています。すでにコンパイラには -std=c++11
を渡しています。
他には何もする必要はありません。GCCには、C++標準ライブラリの独自の実装(libstdc++)が付属しています。この実装は、GCC自体と一緒に開発・テストされているので、GCCのバージョンとlibstdc++のバージョンには100%の互換性があります。std=c++11でコンパイルすると、
g++`コンパイラのC++11機能が有効になり、libstdc++ヘッダのC++11機能も有効になります。