2013-01-09 468 views
51

我想在Mac Terminal中編譯C++ 11源代碼但失敗。我試過g++ -std=c++11g++ -std=c++0x,g++ -std=gnu++11g++ -std=gnu++0x,但沒有任何工作。終端總是閱讀unrecognized command line option。然而,g++ -std=gnu和類似的東西很好(當然C++ 11源代碼無法通過)。如何在Mac終端中使用C++ 11支持編譯C++

我應該使用哪個選項來打開C++ 11支持?

順便說一句,我使用的命令行工具安裝在Xcode中,我很確定它們是最新的。

+1

Xcode附帶的GCC是**不**最新的,實際上它是古老的。試試'clang ++'。 – 2013-01-09 05:39:20

+0

@ H2CO3清涼,工作完美。謝謝。然而,'鏗鏘++'警告我C++ 11的功能...任何選項來關閉這些警告? – 4ae1e1

+0

使用'-w'選項關閉所有警告。 – 2013-01-09 05:53:58

回答

79

正如其他人指出,你應該使用clang++而不是g++。另外,您應該使用libC++庫而不是默認的libstdC++;包含的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

+0

感謝您的額外信息! – 4ae1e1

+3

剛剛測試了你說的話。事實上,一個簡單的'std :: array'將默認的'libstdC++'敲出。 – 4ae1e1

+0

是否在編譯'std :: is_heap()'時沒有'-stdlib = libC++'' – shiraz

20

XCode在編譯時使用clangclang++,而不是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 

由於bames53的答案指出,我已經離開了-stdlib=libc++

如果你想使用一些GNU擴展(也使用C++ 11),你可以使用-std=gnu++11代替-std=c++11,這將打開C++ 11模式,並且還保持GNU擴展功能。

+0

太棒了。非常感謝你。 – 4ae1e1

+8

不知道-1的用途是什麼......如果是因爲我遺漏了'-stdlib = C++',它會很高興有一個評論,所以我可以更快地修復它! – Cornstalks