GCC Compiler è un compilatore C molto potente e popolare per varie distribuzioni Linux. Questo articolo spiega alcune delle popolari opzioni del compilatore GCC.
Un esempio di codice C
In questo articolo verrà utilizzato il seguente codice C di base (main.c):
#include<stdio.h> int main(void) { printf("\n The Geek Stuff\n"); return 0; }
Opzioni del compilatore GCC
1. Specificare il nome dell'eseguibile di output
Nella sua forma più semplice, il compilatore gcc può essere usato come :
gcc main.c
Il comando precedente esegue l'intero processo di compilazione e restituisce un eseguibile con nome a.out.
Utilizzare l'opzione -o, come mostrato di seguito, per specificare il nome del file di output per l'eseguibile.
gcc main.c -o main
Il comando sopra produrrebbe un file di output con il nome "main".
Per comprendere il processo di compilazione completo di un compilatore GCC, leggi il nostro articolo Viaggio di un programma C verso l'eseguibile Linux in 4 fasi.
2. Abilita tutti gli avvisi impostati tramite l'opzione -Muro
Questa opzione abilita tutti gli avvisi in GCC.
#include<stdio.h> int main(void) { int i; printf("\n The Geek Stuff [%d]\n", i); return 0; }
Se il codice sopra viene compilato, viene prodotto il seguente avviso relativo alla variabile i non inizializzata:
$ gcc -Wall main.c -o main main.c: In function ‘main’: main.c:6:10: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
3. Produci solo l'output del preprocessore con l'opzione -E
L'output della fase di preelaborazione può essere prodotto utilizzando l'opzione -E.
$ gcc -E main.c > main.i
Il comando gcc produce l'output su stdout in modo da poter reindirizzare l'output in qualsiasi file. Nel nostro caso (sopra), il file main.i conterrebbe l'output preelaborato.
4. Produci solo il codice assembly usando l'opzione -S
L'output a livello di assieme può essere prodotto usando l'opzione -S.
gcc -S main.c > main.s
In questo caso, il file main.s conterrebbe l'output dell'assembly.
5. Produci solo il codice compilato usando l'opzione -C
Per produrre solo il codice compilato (senza alcun collegamento), usa l'opzione -C.
gcc -C main.c
Il comando sopra produrrebbe un file main.o che conterrebbe il codice a livello di macchina o il codice compilato.
6. Produci tutti i file intermedi usando la funzione -save-temps
L'opzione -save-temps può fare tutto il lavoro svolto negli esempi 4,5 e 6 sopra. Attraverso questa opzione, l'output in tutte le fasi della compilazione viene memorizzato nella directory corrente. Tieni presente che questa opzione produce anche l'eseguibile.
Ad esempio :
$ gcc -save-temps main.c $ ls a.out main.c main.i main.o main.s
Quindi vediamo che tutti i file intermedi e l'eseguibile finale sono stati prodotti nell'output.
7. Collegamento con librerie condivise usando l'opzione -l
L'opzione -l può essere usata per collegare le librerie condivise. Ad esempio:
gcc -Wall main.c -o main -lCPPfile
Il comando gcc sopra menzionato collega il codice main.c con la libreria condivisa libCPPfile.so per produrre l'eseguibile finale 'main'.
8. Crea codice indipendente dalla posizione usando l'opzione -fPIC
Durante la creazione delle librerie condivise, dovrebbe essere prodotto codice indipendente dalla posizione. Questo aiuta la libreria condivisa a essere caricata come qualsiasi indirizzo anziché come indirizzo fisso. Per questo viene utilizzata l'opzione -fPIC.
Ad esempio, i seguenti comandi creano una libreria condivisa libCfile.so dal file sorgente Cfile.c:
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
Quindi vediamo che l'opzione -fPIC è stata utilizzata nella creazione di una libreria condivisa.
9. Stampa tutti i comandi eseguiti usando l'opzione -V
L'opzione -v può essere utilizzata per fornire informazioni dettagliate su tutti i passaggi eseguiti da gcc durante la compilazione di un file sorgente.
Ad esempio :
$ gcc -Wall -v main.c -o main Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ... ... ...
Quindi vediamo che nell'output sono state prodotte informazioni dettagliate.
10. Abilita il supporto dei programmi ISO C89 usando l'opzione -ansi
Tramite l'opzione -ansi viene abilitato il supporto per lo stile ISO C89.
Considera il seguente codice :
#include<stdio.h> int main(void) { // Print the string printf("\n The Geek Stuff\n"); return 0; }
Se il codice sopra è compilato con l'opzione -ansi, gcc produrrebbe un errore perché i commenti C++ non sono consentiti nello stile ISO C89.
Ecco l'output:
$ gcc -Wall -ansi main.c -o main main.c: In function ‘main’: main.c:5:3: error: expected expression before ‘/’ token
Quindi vediamo che gcc ha generato un errore relativo allo stile di commento.
11. Interpreta char come unsigned char usando l'opzione -funsigned-char
Attraverso questa opzione, il tipo char viene trattato come unsigned type.
Ecco un esempio :
#include<stdio.h> int main(void) { char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Quando il codice sopra viene compilato con l'opzione funsigned-char, ecco l'output:
$ gcc -Wall -funsigned-char main.c -o main $ ./main The Geek Stuff [246]
Quindi vediamo che il carattere è stato effettivamente trattato come non firmato.
12. Interpreta char come char firmato usando l'opzione -fsigned-char
Questo è l'opposto di ciò che abbiamo discusso in (12) sopra. Usando questo flag, le variabili char vengono trattate come firmate.
Ecco un esempio :
$ gcc -Wall -fsigned-char main.c -o main $ ./main The Geek Stuff [-10]
L'output conferma che char è stato trattato come firmato.
13. Usa le macro in fase di compilazione usando l'opzione -D
L'opzione del compilatore D può essere utilizzata per definire le macro in fase di compilazione nel codice.
Ecco un esempio :
#include<stdio.h> int main(void) { #ifdef MY_MACRO printf("\n Macro defined \n"); #endif char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
L'opzione del compilatore -D può essere utilizzata per definire la macro MY_MACRO dalla riga di comando.
$ gcc -Wall -DMY_MACRO main.c -o main $ ./main Macro defined The Geek Stuff [-10]
La stampa relativa alla macro nell'output conferma che la macro è stata definita.
14. Converti gli avvisi in errori con l'opzione -Werror
Attraverso questa opzione, qualsiasi avviso che gcc potrebbe segnalare viene convertito in errore.
Ecco un esempio :
#include<stdio.h> int main(void) { char c; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
La compilazione del codice precedente dovrebbe generare un avviso relativo alla variabile c non definita e questo dovrebbe essere convertito in errore utilizzando l'opzione -Werror.
$ gcc -Wall -Werror main.c -o main main.c: In function ‘main’: main.c:7:10: error: ‘c’ is used uninitialized in this function [-Werror=uninitialized] cc1: all warnings being treated as errors
15. Fornisci le opzioni gcc tramite un file usando @ opzione
Le opzioni per gcc possono anche essere fornite tramite un file. Questo può essere fatto usando l'opzione @ seguita dal nome del file contenente le opzioni. Più opzioni sono separate da uno spazio bianco.
Ecco un esempio :
$ cat opt_file -Wall -omain
Il file opt contiene le opzioni.
Ora compila il codice fornendo opt_file insieme all'opzione @.
$ gcc main.c @opt_file main.c: In function ‘main’: main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] $ ls main main
L'output conferma che il file opt_file è stato analizzato per ottenere le opzioni e la compilazione è stata eseguita di conseguenza.