gccIniziare con gcc


Osservazioni

GCC (maiuscolo) si riferisce alla collezione del compilatore GNU. Questa è una suite di compilazione open source che include compilatori per C, C ++, Objective C, Fortran, Ada, Go e Java. gcc (minuscolo) è il compilatore C nella raccolta del compilatore GNU. Storicamente GCC e gcc sono stati usati in modo intercambiabile, ma sono stati compiuti sforzi per separare i due termini in quanto GCC contiene strumenti per compilare più di C.

La documentazione in questa sezione farà riferimento a gcc, il compilatore C GNU. L'intento è di fornire una rapida ricerca di azioni e opzioni comuni. Il progetto GCC ha una documentazione dettagliata su https://gcc.gnu.org che documenta l'installazione, l'uso generale e ogni opzione della riga di comando. Si prega di fare riferimento alla documentazione ufficiale di GCC su qualsiasi domanda non risponda qui. Se un determinato argomento non è chiaro nella documentazione GCC, si prega di richiedere esempi specifici.

Versioni

Versione Data di rilascio
7.1 2017/05/02
6.3 2016/12/21
6.2 2016/08/22
5.4 2016/06/03
6.1 2016/04/27
5.3 2015/12/04
5.2 2015/07/16
5.1 2015/04/22
4.9 2014/04/22
4.8 2013/03/22
4.7 2012-03-22
4.6 2011-03-25
4.5 2010-04-14
4.4 2009-04-21
4.3 2008-03-05
4.2 2007-05-13
4.1 2006-02-28
4.0 2005-04-20
3.4 2004/04/18
3.3 2003-05-13
3.2 2002/08/14
3.1 2002/05/15
3.0 2001-06-18
2.95 1999/07/31
2.8 1998/01/07
2.7 1995/06/16
2.6 1994/07/14
2.5 1993/10/22
2.4 1993/05/17
2.3 1992/10/31
2.2 1992/06/08
2.1 1992/03/24
2.0 1992/02/22
1.42 1992/09/20
1.41 1992/07/13
1.40 1991/06/01
1.39 1991/01/16
1.38 1990/12/21
1.37 1990/02/11
1.36 1989/09/24
1.35 1989/04/26
1.34 1989/02/23
1.33 1989/02/01
1.32 1988/12/21
1.31 1988/11/19
1.30 1988/10/13
1.29 1988/10/06
1.28 1988/09/14
1.27 1988/09/05
1.26 1988/08/18
1.25 1988/08/03
1.24 1988/07/02
1.23 1988/06/26
1.22 1988/05/22
1.21 1988/05/01
1.20 1988/04/19
1.19 1988/03/29
1.18 1988/02/04
1.17 1988/01/09
1.16 1987/12/19
1.15 1987/11/28
1.14 1987/11/06
1.13 1987/10/12
1.12 1987/10/03
1.11 1987/09/05
1.10 1987/08/22
1.9 1987/08/18
1.8 1987/08/10
1.7 1987/07/21
1.6 1987/07/02
1.5 1987/06/18
1.4 1987-06-13
1.3 1987/06/10
1.2 1987/06/01
1.1 1987/05/24
1.0 1987/05/23
0.9 1987/03/22

"Ciao mondo!" con le opzioni della riga di comando comuni

Per i programmi con un singolo file sorgente, l'utilizzo di gcc è semplice.

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}
 

Per compilare il file hello_world.c dalla riga di comando:

gcc hello_world.c
 

gcc compilerà quindi il programma e produrrà l'eseguibile nel file a.out. Se vuoi dare un nome all'eseguibile, usa l'opzione -o.

gcc hello_world.c -o hello_world
 

L'eseguibile verrà quindi denominato hello_world anziché a.out. Per impostazione predefinita, non ci sono molti avvisi che vengono emessi da gcc. gcc ha molte opzioni di avviso ed è una buona idea dare un'occhiata alla documentazione di gcc per sapere cosa è disponibile. L'uso di "-Wall" è un buon punto di partenza e copre molti problemi comuni.

gcc -Wall hello_world.c -o hello_world
 

Produzione:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^
 

Qui vediamo che ora riceviamo un avviso che la variabile 'i' è stata dichiarata ma non utilizzata affatto nella funzione.

Se prevedi di utilizzare un debugger per testare il tuo programma, devi dire a gcc di includere le informazioni di debug. Utilizzare l'opzione '-g' per il supporto per il debug.

gcc -Wall -g hello_world.c -o hello_world
 

hello_world ha ora il debug delle informazioni presenti supportate da GDB. Se si utilizza un debugger diverso, potrebbe essere necessario utilizzare diverse opzioni di debug in modo che l'output sia formattato correttamente. Vedi la documentazione ufficiale di gcc per ulteriori opzioni di debug.

Di default gcc compila il codice in modo che sia facile eseguire il debug. gcc può ottimizzare l'output in modo che l'eseguibile finale produca lo stesso risultato ma abbia prestazioni più veloci e possa risultare in un eseguibile di dimensioni più ridotte. L'opzione '-O' consente l'ottimizzazione. Esistono diversi qualificatori riconosciuti da aggiungere dopo l'O per specificare il livello di ottimizzazione. Ogni livello di ottimizzazione aggiunge o rimuove un elenco di opzioni di riga di comando. '-O2', '-Os', '-O0' e '-Og' sono i livelli di ottimizzazione più comuni.

gcc -Wall -O2 hello_world.c -o hello_world
 

'-O2' è il livello di ottimizzazione più comune per il codice pronto per la produzione. Fornisce un eccellente equilibrio tra aumento delle prestazioni e dimensioni dell'esecuzione finale.

gcc -Wall -Os hello_world.c -o hello_world
 

'-Os' è simile a '-O2', tranne alcune ottimizzazioni che possono aumentare la velocità di esecuzione aumentando le dimensioni dell'eseguibile sono disabilitate. Se la dimensione dell'eseguibile finale è importante per te, prova con "-Os" e verifica se c'è una notevole differenza di dimensioni nell'eseguibile finale.

gcc -Wall -g -Og hello_world.c -o -hello_world
 

Nota che negli esempi precedenti con "-Os" e "-O2", l'opzione "-g" è stata rimossa. Questo perché quando quando inizi a dire al compilatore di ottimizzare il codice, alcune righe di codice potrebbero non essere più presenti nell'esecuzione finale rendendo difficile il debug. Tuttavia, ci sono anche casi in cui determinati errori si verificano solo quando le ottimizzazioni sono attive. Se vuoi eseguire il debug dell'applicazione e fare in modo che il compilatore ottimizzi il codice, prova l'opzione '-Og'. Questo dice a gcc di eseguire tutte le ottimizzazioni che non dovrebbero ostacolare l'esperienza di debug.

gcc -Wall -g -O0 hello_world.c -o hello_world
 

'-O0' esegue ancora meno ottimizzazioni di '-Og'. Questo è il livello di ottimizzazione utilizzato da gcc per impostazione predefinita. Utilizzare questa opzione se si desidera assicurarsi che le ottimizzazioni siano disabilitate.

Determina la versione di gcc

Quando fai riferimento alla documentazione di gcc, dovresti sapere quale versione di gcc stai usando. Il progetto GCC ha un manuale per ogni versione di gcc che include funzionalità implementate in quella versione. Usa l'opzione '-v' per determinare la versione di gcc che stai utilizzando.

gcc -v
 

Esempio di output:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
 

In questo esempio vediamo che stiamo eseguendo gcc versione 5.3.1. Sapresti quindi di fare riferimento al manuale di GCC 5.3. È anche utile includere la versione di gcc quando si fanno domande nel caso si abbia un problema specifico della versione.