Importanti flag GCC in Linux
È possibile utilizzare i flag GCC per estendere la funzionalità del compilatore GCC. Ecco alcune delle bandiere comuni ma importanti.
Se programmi in C o C++ utilizzando Linux, il processo di compilazione sarà gestito dal GCC, ovvero il compilatore C e C++ del progetto GNU.
E come sempre, puoi utilizzare i flag per estendere la funzionalità.
Diamo quindi un'occhiata ad alcune delle bandiere del GCC più importanti.
Importanti flag del GCC
Per rendere le cose facili da capire, utilizzerò il seguente programma C:
#include<stdio.h>
int main(void)
{
printf("\n Linuxhandbook \n");
return 0;
}
Abbastanza semplice, vero? Non giudicare le mie capacità di programmazione.
1. Specificare il nome del file di output utilizzando -o
In parole povere, utilizzerai il compilatore GCC come segue:
gcc main.c
E il comando precedente compilerà il programma e creerà un eseguibile con il nome a.out.
:
Per specificare il nome del file eseguibile di output, tutto ciò che devi fare è aggiungere al nome del file il flag -o
come mostrato di seguito:
gcc main.c -o Filename
Ad esempio, qui ho chiamato il file eseguibile Result
:
gcc main.c -o Result
2. Abilita ogni avviso con -Wall
Se vuoi stampare ogni avviso in modo da poter esaminare il tuo codice e renderlo migliore che mai, usa il flag -Wall
.
gcc -Wall main.c -o Result
Ad esempio, qui utilizzerò un codice senza inizializzare la variabile:
#include<stdio.h>
int main(void)
{
int i;
printf("\n Linuxhandbook [%d]\n", i);
return 0;
}
E quando ho eseguito il codice, mi ha dato un avviso che diceva che 'i' viene utilizzato non inizializzato
:
3. Collegamento con una libreria condivisa utilizzando -l
Per collegare il programma C con una libreria condivisa, tutto ciò che devi fare è aggiungere al nome della libreria condivisa il flag -l
Ad esempio, qui ho collegato il codice main.c con la libreria condivisa pthread
per produrre l'eseguibile finale Result
:
gcc main.c -o Hello -lpthread
Ma cosa succede se vuoi collegare le librerie esterne? In tal caso, dovresti specificare la posizione della libreria esterna utilizzando -L
.
Ad esempio, qui ho collegato la libreria condivisa “LHB” archiviata in /home/user/LHB:
gcc -L/home/user/LHB -o main.c Results -lLHB
4. Ottieni l'output del preprocessore solo usando -E
La pre-elaborazione è la prima fase della compilazione e se ti interessa solo cosa succede al tuo codice nella prima fase, puoi utilizzare il flag -E
.
Qui ho reindirizzato l'output standard al file first-stage.i
:
gcc -E main.c > first-stage.i
5. Ottieni il codice assembly utilizzando -S
Se sei interessato all'output dell'assembly durante la compilazione, può essere facilmente prodotto utilizzando il flag -S
.
Qui, ho prodotto l'output dell'assembly di main.c
denominato main.s
:
gcc -S main.c > main.s
6. Produrre codice compilato utilizzando solo -C
Per ottenere codice compilato senza alcun collegamento, tutto ciò che devi fare è utilizzare il flag -C
.
Ad esempio, qui ho prodotto il codice compilato di main.c
nel file denominato compiled
:
gcc -C main.c -o compiled
7. Produrre tutti i file intermedi utilizzando -save-temps
In precedenza, ho spiegato come ottenere l'output preelaborato, assemblato e compilato, ma cosa succede se ti dico che puoi averli tutti contemporaneamente?
È abbastanza semplice e può essere facilmente prodotto utilizzando il flag -save-temps
.
Diciamo che voglio produrre tutti i file intermedi per il file main.c
quindi mi verrà richiesto di seguire il comando indicato:
gcc -save-temps main.c
8. Converti gli avvisi in errori con -Werror
Durante i test, noi programmatori tendiamo a ignorare gli avvisi che potrebbero indicare lacune e minacce alla sicurezza della tua applicazione.
Per rendere il tuo codice solido, ti suggerirei di convertire i tuoi avvisi in errori utilizzando il flag -Werror
.
Qui, ho usato il codice che ti darebbe un avviso che dice "variabile non definita c":
#include<stdio.h>
int main(void)
{
char c;
// Print the string
printf("\n Linuxhandbook [%d]\n", c);
return 0;
}
Ma quando ho usato il flag -Werror
durante l'esecuzione, invece di un avviso, mi ha dato un errore:
9. Ottieni un codice indipendente dalla posizione utilizzando -fPIC
Questo flag può essere cruciale per coloro che hanno a che fare con collegamenti dinamici, in particolare con librerie condivise.
Durante la creazione delle librerie condivise, dovresti avere il codice indipendente dalla posizione in modo da poter caricare la libreria condivisa da qualsiasi indirizzo anziché da uno statico.
Ad esempio, qui ho creato una libreria condivisa denominata libmain.so
da main.c
:
gcc -c -Wall -Werror -fPIC main.c
gcc -shared -o libmain.so main.o
10. Ottieni l'output dettagliato della compilazione utilizzando -V
Se vuoi sapere cosa sta facendo GCC con il tuo codice riga per riga, puoi utilizzare il flag -V
per avere un output dettagliato.
gcc -Wall -v main.c -o Result
Bonus: applica i flag GCC utilizzando il file
Se stai utilizzando lo stesso set di flag per compilare il programma, avere un file contenente l'opzione necessaria può farti risparmiare molto tempo.
Innanzitutto, creiamo un file utilizzando il comando touch:
touch Flags
Ora puoi utilizzare uno qualsiasi dei tuoi editor di testo preferiti per inserire i flag. Assicurati solo di separarli con spazi.
E ho salvato 3 flag nel file:
Una volta terminata l'aggiunta dei flag, tutto ciò che devi fare è aggiungere il file di testo con il simbolo @
:
gcc main.c @Flags
E come puoi vedere, ha convertito gli avvisi in errori e ha creato tutti i file intermedi.
Avvolgendo
In questo tutorial ho esaminato alcuni dei flag GCC più importanti che puoi utilizzare per la tua compilazione quotidiana.
Consiglio vivamente il suggerimento bonus di cui ho parlato alla fine perché mi ha fatto risparmiare molto tempo ed è comodissimo da usare.
E se hai domande o suggerimenti, faccelo sapere nei commenti.