2013-01-09 17 views
51

Volevo compilare il codice sorgente C++ 11 nel terminale Mac ma non ci sono riuscito. Ho provato g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11 e g++ -std=gnu++0x ma non ha funzionato. Il terminale legge sempre unrecognized command line option. Tuttavia, g++ -std=gnu e cose del genere funzionavano bene (ovviamente il codice sorgente C++ 11 non poteva passare).Come compilare C++ con il supporto C++ 11 nel terminale Mac

Quale opzione devo utilizzare per attivare il supporto C++ 11?

A proposito, lo strumento da riga di comando che sto utilizzando è installato in Xcode e sono abbastanza sicuro che siano aggiornati.

+1

GCC fornito con Xcode è ** non ** aggiornato, infatti è antico. Prova 'clang ++'. –

+0

@ H2CO3 Cool, ha funzionato perfettamente. Grazie. Tuttavia, 'clang ++' mi ha avvertito delle funzionalità di C++ 11 ... Qualche opzione per disattivare questi avvisi? – 4ae1e1

+0

Utilizzare l'opzione '-w' per disattivare tutti gli avvisi. –

risposta

79

Come altri hanno sottolineato, è necessario utilizzare clang++ anziché g++. Inoltre, dovresti usare la libreria libC++ invece del libstdC++ predefinito; La versione inclusa di libstdC++ è piuttosto vecchia e quindi non include le funzionalità della libreria C++ 11.

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

Se non avete installato gli strumenti della riga di comando per Xcode è possibile eseguire il compilatore e altri strumenti senza fare che, utilizzando lo strumento xcrun.

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

Anche se c'è un avviso particolare che si desidera disattivare è possibile passare ulteriori flag al compilatore per farlo. Alla fine dei messaggi di avviso mostra il flag più specifico che abilita l'avviso. Per disabilitare tale avviso, anteporre no- al nome dell'avviso.

Ad esempio, probabilmente non si desiderano gli avvisi di compatibilità C++ 98. Alla fine di tali avvertimenti mostra la bandiera -Wc++98-compat e per disabilitarli si passa -Wno-c++98-compat.

+0

Grazie per le informazioni extra! – 4ae1e1

+3

Appena testato quello che hai detto. In effetti, un semplice 'std :: array' mette fuori gioco' libstdC++ 'predefinito. – 4ae1e1

+0

Sì ha avuto un problema con la compilazione di 'std :: is_heap()' senza '-stdlib = libC++' – shiraz

20

XCode utilizza clang e clang++ durante la compilazione, non g++ (presupponendo che le cose non siano personalizzate). Invece, provare:

$ 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 

Grazie alla risposta di bames53 per aver ricordato che avevo lasciato fuori -stdlib=libc++.

Se si desidera utilizzare alcune estensioni GNU (e utilizzare anche C++ 11), è possibile utilizzare -std=gnu++11 anziché -std=c++11, che attiva la modalità C++ 11 e mantiene anche le estensioni GNU abilitate.

+0

Grande. Grazie mille. – 4ae1e1

+8

Non sono sicuro di cosa fosse -1 per ... Se è perché ho omesso '-stdlib = C++' sarebbe stato carino avere un commento in modo da poterlo aggiustare più velocemente! – Cornstalks