La compilació és el procés de convertir el codi font del llenguatge C en codi màquina. Com que C és un llenguatge de nivell mitjà, necessita un compilador per convertir-lo en un codi executable perquè el programa es pugui executar a la nostra màquina.
El programa C passa per les fases següents durant la compilació:

Procés de compilació en C
Com compilem i executem un programa C?
Primer necessitem un compilador i un editor de codi per compilar i executar un programa C. L'exemple següent és d'una màquina Ubuntu amb compilador GCC.
Pas 1: Creació d'un fitxer font C
Primer creem un programa C amb un editor i desem el fitxer com a filename.c
matriu de retorn de java
$ vi filename.c>
Podem escriure un simple programa hello world i desar-lo.
Pas 2: compilació mitjançant el compilador GCC
Utilitzem l'ordre següent al terminal per compilar el nostre fitxer font filename.c
subcadena de cadena java
$ gcc filename.c –o filename>
Podem passar moltes instruccions al compilador GCC a diferents tasques com ara:
- L'opció -Wall activa tots els missatges d'advertència del compilador. Es recomana aquesta opció per generar un millor codi.
- L'opció -o s'utilitza per especificar el nom del fitxer de sortida. Si no fem servir aquesta opció, es genera un fitxer de sortida amb el nom a.out.
Si no hi ha errors al nostre programa C, es generarà el fitxer executable del programa C.
Pas 3: Execució del programa
Després de generar l'executable de compilació i executem l'executable generat mitjançant l'ordre següent.
$ ./filename>
El programa s'executarà i la sortida es mostrarà al terminal.
Què hi ha dins del procés de compilació?
Un compilador converteix un programa C en un executable. Hi ha quatre fases perquè un programa C es converteixi en un executable:
- Enllaç de muntatge de compilació de preprocessament
En executar l'ordre següent, obtenim tots els fitxers intermedis del directori actual juntament amb l'executable.
$gcc -Wall -save-temps filename.c –o filename>
La captura de pantalla següent mostra tots els fitxers intermedis generats.
alineació d'imatges en css
Fitxers intermedis
Anem a veure un per un què contenen aquests fitxers intermedis.
inserir al teclat
1. Tramitació prèvia
Aquesta és la primera fase per la qual es passa el codi font. Aquesta fase inclou:
- Eliminació de comentaris
- Ampliació de macros
- Ampliació dels fitxers inclosos.
- Compilació condicional
La sortida preprocessada s'emmagatzema al fitxer nom de fitxer.i . Vegem què hi ha dins filename.i: using $vi nom de fitxer.i
A la sortida anterior, el fitxer font s'omple amb molta i molta informació, però al final, el nostre codi es conserva.
- printf conté ara a + b en lloc d'afegir (a, b) perquè les macros s'han expandit.
- Els comentaris s'eliminen. Falta #include, en canvi veiem molt de codi. Així, els fitxers de capçalera s'han ampliat i inclosos al nostre fitxer font.
2. Compilació
El següent pas és compilar filename.i i produir un; fitxer de sortida compilat intermedi nom de fitxer.s . Aquest fitxer es troba en instruccions de nivell de muntatge. Vegem a través d'aquest fitxer utilitzant $nano nom de fitxer.s comandament del terminal.
Fitxer de codi de muntatge
La instantània mostra que està en llenguatge assemblador, que l'assemblador pot entendre.
3. Muntatge
En aquesta fase, el filename.s es pren com a entrada i es converteix en nom de fitxer.o pel muntador. Aquest fitxer conté instruccions a nivell de màquina. En aquesta fase, només el codi existent es converteix en llenguatge màquina i les crides a funcions com printf() no es resolen. Vegem aquest fitxer utilitzant $vi nom de fitxer.o
pandes loc
Codi binari
4. Enllaç
Aquesta és la fase final en què es realitza tota l'enllaç de les crides de funció amb les seves definicions. Linker sap on s'implementen totes aquestes funcions. Linker també fa un treball addicional, afegeix un codi addicional al nostre programa que es requereix quan el programa comença i acaba. Per exemple, hi ha un codi que es requereix per configurar l'entorn, com ara passar arguments de línia d'ordres. Aquesta tasca es pot verificar fàcilment mitjançant l'ús $size nom de fitxer.o i nom de fitxer $size . Mitjançant aquestes ordres, sabem com augmenta el fitxer de sortida d'un fitxer objecte a un fitxer executable. Això es deu al codi addicional que Linker afegeix al nostre programa.
Nota: GCC fa enllaços dinàmics per defecte, de manera que printf() està enllaçat dinàmicament al programa anterior. Consulteu això, això i això per obtenir més detalls sobre els enllaços estàtics i dinàmics.