0Pricing
C Academy · Lezione

Compilare più file

Costruisca un programma composto da più file.

Compilare più file è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Dal sorgente al programma

La trasformazione di sorgenti C suddivisi in più file in un eseguibile avviene in due fasi: compilazione e collegamento.

Ogni file .c viene compilato separatamente in un file oggetto. Il linker combina poi tutti i file oggetto, risolvendo i riferimenti tra loro, in un unico programma eseguibile.

La compilazione con un solo comando

L'approccio più semplice passa contemporaneamente tutti i file sorgente a gcc. Il compilatore compila ciascun file e poi li collega automaticamente.

L'opzione -o assegna il nome al programma di output. Elenchi tutti i file .c; gli header vengono inclusi tramite #include e non vanno elencati qui.

gcc main.c math_utils.c -o app

Compilazione separata

Nei progetti più grandi, compili ogni file in un file oggetto usando -c. Questa operazione produce un file .o e non esegue il collegamento.

La compilazione separata fa sì che, quando si modifica un solo sorgente, sia necessario ricompilare soltanto quel file, velocizzando le build di grandi dimensioni.

gcc -c main.c        /* produces main.o */
gcc -c math_utils.c  /* produces math_utils.o */

La fase di collegamento

Una volta ottenuti i file oggetto, li colleghi per creare un eseguibile. In questo caso gcc agisce da linker, unendo gli oggetti e risolvendo i simboli tra i file.

Questa volta non si usa -c, perché si desidera un programma finale, non un altro file oggetto.

gcc main.o math_utils.o -o app

Cosa fa il linker

Il linker associa ogni utilizzo di un simbolo alla sua definizione.

Quando main.o chiama add, il linker trova la definizione di add in math_utils.o e li collega. Inoltre include il codice della libreria standard necessario al programma.

Errori di riferimento non definito

Se si dimentica un file oggetto durante il collegamento, il linker non riesce a trovare una definizione e segnala un riferimento non definito.

Si tratta di un errore in fase di collegamento, non di compilazione: ogni file è stato compilato correttamente, ma nella riga di comando finale manca una definizione necessaria.

gcc main.o -o app
/* undefined reference to `add' */
/* fix: include math_utils.o */

Opzioni utili per gli avvisi

Compili sempre abilitando gli avvisi. -Wall e -Wextra fanno emergere tempestivamente i possibili bug.

L'aggiunta di -std=c11 seleziona uno standard del linguaggio, rendendo il comportamento prevedibile tra compilatori diversi. Queste opzioni funzionano sia compilando in un'unica fase sia separatamente.

gcc -Wall -Wextra -std=c11 -c main.c
gcc -Wall -Wextra -std=c11 -c math_utils.c
gcc main.o math_utils.o -o app

Percorsi degli include

Quando gli header si trovano in un'altra directory, comunichi al compilatore dove cercarli usando -I.

Ad esempio, -Iinclude aggiunge la cartella include/ al percorso di ricerca, così #include "math_utils.h" viene risolto anche da una cartella diversa.

gcc -Iinclude -c src/main.c -o build/main.o

Perché la ricompilazione è importante

La compilazione separata è particolarmente utile quando cambia un solo file. Si ricompila l'oggetto relativo a quel file e poi si esegue nuovamente il collegamento.

Se però si modifica un header, è necessario ricompilare ogni sorgente che lo include, perché il testo dell'header fa parte di ciascuno di essi.

/* edited math_utils.c only */
gcc -c math_utils.c
gcc main.o math_utils.o -o app

Automatizzare con make

Digitare i comandi manualmente diventa noioso. Un Makefile registra le regole e ricostruisce solo ciò che è cambiato.

Questo esempio minimale collega due oggetti in app; make tiene traccia dei timestamp dei file per decidere cosa ricompilare.

app: main.o math_utils.o
	gcc main.o math_utils.o -o app

main.o: main.c math_utils.h
	gcc -c main.c

Riepilogo completo della build

Ecco l'intero flusso per un piccolo progetto, dai file oggetto al programma finito con gli avvisi abilitati.

Compili ogni sorgente e poi colleghi gli oggetti. Esegua il risultato per verificare che funzioni dall'inizio alla fine.

gcc -Wall -c main.c
gcc -Wall -c math_utils.c
gcc main.o math_utils.o -o app
./app

Verifica rapida

Verifichi la propria comprensione del processo di build con più file.

Riepilogo

Ha imparato a compilare ogni file .c in un oggetto con -c e poi a collegare gli oggetti in un programma. Utilizzi -Wall e -I rispettivamente per gli avvisi e i percorsi degli include.

I riferimenti non definiti indicano che manca un oggetto in fase di collegamento. Strumenti come make automatizzano la ricostruzione del solo codice modificato.

Domande Frequenti

La lezione «Compilare più file» è gratuita?

Sì — il testo completo di «Compilare più file» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Compilare più file»?

Costruisca un programma composto da più file. Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Compilare più file»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. File header e sorgente
  2. Guardie di inclusione
  3. extern e linkage
  4. Compilare più file
← Torna a C Academy