2013-01-09 25 views
51

Chciałem skompilować kod źródłowy C++ 11 w Terminalu Mac, ale się nie udało. Próbowałem g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11 i g++ -std=gnu++0x, ale nic nie działało. Terminal zawsze czyta unrecognized command line option. Jednak g++ -std=gnu i podobne rzeczy działały dobrze (oczywiście kod źródłowy C++ 11 nie mógł przejść).Jak skompilować C++ z obsługą C++ 11 w Mac Terminal

Którą opcję należy użyć, aby włączyć obsługę C++ 11?

Nawiasem mówiąc, narzędzie wiersza poleceń, którego używam, jest zainstalowane w Xcode i jestem prawie pewien, że są aktualne.

+1

GCC dostarczany z Xcode jest ** nie ** aktualny, w rzeczywistości jest starożytny. Spróbuj 'clang ++'. –

+0

@ H2CO3 Cool, działa idealnie. Dzięki. Jednak "clang ++" ostrzegł mnie przed funkcjami C++ 11 ... Jakieś opcje wyłączenia tych ostrzeżeń? – 4ae1e1

+0

Użyj opcji '-w', aby wyłączyć wszystkie ostrzeżenia. –

Odpowiedz

79

Jak inni podkreślili, powinieneś użyć clang++ zamiast g++. Powinieneś także użyć biblioteki libC++ zamiast domyślnego libstdC++; Dołączona wersja biblioteki libstdC++ jest dość stara i dlatego nie zawiera funkcji biblioteki C++ 11.

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

Jeśli nie masz zainstalowanego narzędzia wiersza polecenia dla Xcode można uruchomić kompilator i inne narzędzia, nie robiąc, że za pomocą funkcji xcrun.

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

Jeśli istnieje specjalne ostrzeżenie, które chcesz wyłączyć, możesz przekazać dodatkowe flagi do kompilatora, aby to zrobić. Na końcu komunikatów ostrzegawczych pokazuje najbardziej szczegółową flagę, która umożliwi ostrzeżenie. Aby wyłączyć to ostrzeżenie, dodaj no- do nazwy ostrzeżenia.

Na przykład prawdopodobnie nie chcesz ostrzeżeń o zgodności z C++ 98. Na końcu tych ostrzeżeń pokazuje flagę -Wc++98-compat, a aby je wyłączyć, należy podać -Wno-c++98-compat.

+0

Dzięki za dodatkowe informacje! – 4ae1e1

+3

Sprawdziłem, co powiedziałeś. Rzeczywiście, prosta 'std :: array' powala domyślnie' libstdC++ '. – 4ae1e1

+0

Tak, miałem problem ze skompilowaniem 'std :: is_heap()' bez '-stdlib = libC++' – shiraz

20

XCode używa clang i clang++ podczas kompilacji, a nie g++ (zakładając, że nie masz dostosowanych rzeczy). Zamiast tego, spróbuj:

$ 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 

Dzięki za odpowiedź bames53 wskazując, że wyszedłem z -stdlib=libc++.

Jeśli chcesz używać niektórych rozszerzeń GNU (a także używać C++ 11), możesz użyć -std=gnu++11 zamiast -std=c++11, co spowoduje włączenie trybu C++ 11 i włączenie rozszerzeń GNU.

+0

Świetny. Dziękuję Ci bardzo. – 4ae1e1

+8

Nie jestem pewien, co było -1 dla ... Jeśli to dlatego, że pominąłem '-stdlib = C++' byłoby miło mieć komentarz, więc mogłem to naprawić szybciej! – Cornstalks