web-dev-qa-db-ja.com

MacターミナルでC ++ 11をサポートするC ++をコンパイルする方法

Macターミナル内でC++ 11ソースコードをコンパイルしたかったのですが、失敗しました。 g++ -std=c++11g++ -std=c++0xg++ -std=gnu++11、およびg++ -std=gnu++0xを試しましたが、何も機能しませんでした。端末は常にunrecognized command line optionを読み取ります。ただし、g++ -std=gnuおよびそのようなものは正常に機能しました(もちろんC++ 11ソースコードは渡せませんでした)。

C++ 11サポートを有効にするには、どのオプションを使用する必要がありますか?

ちなみに、使用しているコマンドラインツールはXcode内にインストールされており、最新のものであると確信しています。

65
4ae1e1

他の人が指摘したように、clang++ではなくg++を使用する必要があります。また、デフォルトのlibstdc ++の代わりにlibc ++ライブラリを使用する必要があります。含まれているlibstdc ++のバージョンはかなり古いため、C++ 11ライブラリ機能は含まれていません。

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

Xcodeのコマンドラインツールをインストールしていない場合は、xcrunツールを使用して、コンパイラやその他のツールを実行せずに実行できます。

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

また、無効にする特定の警告がある場合は、追加のフラグをコンパイラに渡して無効にすることができます。警告メッセージの最後に、警告を有効にする最も具体的なフラグが表示されます。その警告を無効にするには、警告名の前にno-を追加します。

たとえば、おそらくc ++ 98互換性の警告は必要ありません。それらの警告の最後にフラグ-Wc++98-compatが表示され、それらを無効にするには-Wno-c++98-compatを渡します。

96
bames53

XCodeは、コンパイル時にclangおよびclang++を使用しますが、g++ではありません(カスタマイズしていない場合)。代わりに、試してください:

$ cat t.cpp
#include <iostream>

int main()
{
    int* p = nullptr;
    std::cout << p << std::endl;
}
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
$ ./a.out 
0x0

-stdlib=libc++を除外したことを指摘してくれたbames53の回答に感謝します。

いくつかのGNU拡張機能(およびC++ 11も使用)を使用する場合は、-std=gnu++11の代わりに-std=c++11を使用できます。これにより、C++ 11モードが有効になり、 GNU拡張機能も有効のままにしてください。

24
Cornstalks