Prendiamo in esame il programma scritto nella lezione precedente:
/*
hello.c
Primo programma C - Questo programma scrive sullo stdout
la stringa "Hello World"
*/
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
}
Come abbiamo già detto il processo di compilazione può comprendere fino a quattro stadi distinti:
- Fase di preprocessing
- Compilazione vera e propria
- Assemblaggio
- Linking
In questa lezione compileremo il programma, cioè produrremo il file binario partendo dal file sorgente bloccandoci alla fine di ogni fase di compilazione.
Il processo di compilazione riceve in ingresso il file
hello.c, questo file viene elaborato dallo stadio di preprocessing.
Fase di preprocessing
Il primo stadio della fase di compilazione è lo stadio di preprocessing. Questo stadio riceve in ingresso il file hello.c è produce in uscita il file hello.cpp.
In questa fase vengono espanse le macro e viene inserito il contenuto dei file di #include.
Esaminiamo nel dettaglio come gcc produce hello.cpp.
Per fermare la compilazione dopo la fase di preprocessing usiamo l'opzione
-E di gcc:
$ gcc -E hello.c -o hello.cpp
Se andiamo ad esaminare hello.cpp osserviamo che il contenuto di stdio.h è stato effettivamente incluso nel file insieme alle direttive di preprocessing.
Compilazione vera e propria
In questo stadio avviene la compilazione vera e propria. Il file di ingresso hello.cpp proveniente dalla fase di compilazione viene compilato è in uscita da questa fase viene prodotto il file oggetto
hello.o
Per svolgere questa fase dobbiamo dire a gcc:
- di prendere il codice già preprocessato (usiamo l'opzione -x cpp-output, significa "inizia la compilazione dall'operazione indicata, in questo caso dal codice sorgente preprocessato)
- di compilarlo (usiamo l'opzione -c significa "compila il file che segue l'opzione")
- di produrre il codice oggetto (usiamo l'opzione -o con questa opzione specifichiamo il nome del file oggetto")
La riga completa è:
$ gcc -x cpp-output -c hello.cpp -o hello.o
Linking
Sucessivamente alla fase di compilazione c'è la fase di linking. Il linker, ld, crea il file binario hello.
Per ottenere il file binario dal file oggetto facciamo fare la fase di linking a gcc:
$ gcc hello.o -o hello
Abbiamo ottenuto il nostro file binario passando per le varie fasi di compilazione!