C++ Compilare con GCC

Esempio

Supponendo un singolo file sorgente denominato main.cpp , il comando per compilare e collegare un eseguibile non ottimizzato è il seguente (Compilare senza ottimizzazione è utile per lo sviluppo iniziale e il debug, sebbene -Og sia ufficialmente raccomandato per le nuove versioni di GCC).

g++ -o app -Wall main.cpp -O0

Per produrre un eseguibile ottimizzato per l'utilizzo in produzione, utilizzare una delle opzioni -O (vedere: -O1 , -O2 , -O3 , -Os , -Ofast ):

g++ -o app -Wall -O2 main.cpp

Se l'opzione -O viene omessa, -O0, che significa nessuna ottimizzazione, viene utilizzata come predefinita (specificando -O senza un numero si risolve in -O1).

In alternativa, utilizzare i flag di ottimizzazione dai gruppi O (o più ottimizzazioni sperimentali) direttamente. Il seguente esempio costruisce con l'ottimizzazione -O2 , più un flag dal livello di ottimizzazione -O3 :

g++ -o app -Wall -O2 -ftree-partial-pre main.cpp

Per produrre un eseguibile ottimizzato specifico per piattaforma (da utilizzare nella produzione sulla macchina con la stessa architettura), utilizzare:

g++ -o app -Wall -O2 -march=native main.cpp

Uno dei due precedenti produrrà un file binario che può essere eseguito con .\app.exe su Windows e ./app su Linux, Mac OS, ecc.

Il flag -o può anche essere saltato. In questo caso, GCC creerà l'output eseguibile predefinito a.exe su Windows e a.out su sistemi simil-Unix. Per compilare un file senza collegarlo, utilizzare l'opzione -c :

g++ -o file.o -Wall -c file.cpp

Questo produce un file oggetto denominato file.o che può essere successivamente collegato ad altri file per produrre un binario:

g++ -o app file.o otherfile.o

Ulteriori informazioni sulle opzioni di ottimizzazione sono disponibili su gcc.gnu.org . Di particolare nota sono -Og (ottimizzazione con enfasi sull'esperienza di debug - raccomandata per il ciclo standard edit-compile-debug) e -Ofast (tutte le ottimizzazioni, comprese quelle che ignorano la conformità agli standard rigorosi).

Il flag -Wall abilita gli avvisi per molti errori comuni e deve essere sempre utilizzato. Per migliorare la qualità del codice, spesso è anche consigliato utilizzare -Wextra e altri flag di avviso che non sono automaticamente abilitati da -Wall e -Wextra .

Se il codice prevede uno specifico standard C ++, specificare quale standard utilizzare includendo il flag -std= . I valori supportati corrispondono all'anno di finalizzazione per ciascuna versione dello standard ISO C ++. A partire da GCC 6.1.0, i valori validi per lo std= flag sono c++98 / c++03 , c++11 , c++14 e c++17 / c++1z . I valori separati da una barra diretta sono equivalenti.

g++ -std=c++11 <file>

GCC include alcune estensioni specifiche del compilatore che sono disabilitate quando sono in conflitto con uno standard specificato dal flag -std= . Per compilare con tutte le estensioni abilitate, è possibile utilizzare il valore gnu++XX , dove XX è uno degli anni utilizzati dai valori c++ sopra elencati.

Lo standard predefinito verrà utilizzato se non viene specificato nessuno. Per le versioni di GCC precedenti alla 6.1.0, il valore predefinito è -std=gnu++03 ; in GCC 6.1.0 e -std=gnu++14 , il valore predefinito è -std=gnu++14 .

Si noti che a causa di bug in GCC, il flag -pthread deve essere presente alla compilazione e al collegamento per GCC per supportare la funzionalità di threading standard C ++ introdotta con C ++ 11, come std::thread e std::wait_for . Omettendola quando si usano le funzioni di threading, non si ottengono avvisi ma risultati non validi su alcune piattaforme.

Collegamento con le librerie:

Utilizzare l'opzione -l per passare il nome della libreria:

g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)

Se la libreria non si trova nel percorso della libreria standard, aggiungere il percorso con l'opzione -L :

g++ main.cpp -L/my/custom/path/ -lmylib

Le librerie multiple possono essere collegate tra loro:

g++ main.cpp -lmylib1 -lmylib2 -lmylib3

Se una libreria dipende da un'altra, metti la libreria dipendente prima della libreria indipendente:

g++ main.cpp -lchild-lib -lbase-lib

Oppure lascia che il linker determini l'ordinamento stesso tramite --start-group e --end-group (nota: questo ha un costo significativo delle prestazioni):

g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group