Makefile
Automatizzare la build
Makefile è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Perché usare i Makefile
Digitare a mano i comandi gcc diventa rapidamente ingestibile. make legge un Makefile che descrive come compilare il progetto ed esegue solo i comandi necessari.
La sua caratteristica principale: ricompila un file solo quando i suoi input sono più recenti del suo output, facendo risparmiare moltissimo tempo di compilazione.
Anatomia di una regola
Una regola ha tre parti: un target, i suoi prerequisiti e una ricetta.
La riga della ricetta DEVE iniziare con un vero carattere TAB, non con spazi. Questo è l'errore più comune nei Makefile.
target: prerequisite1 prerequisite2
<TAB>command to build targetUn primo Makefile
Questo compila app a partire da due file sorgente. Eseguendo make senza argomenti viene compilato il primo target.
Se nessuno dei due sorgenti è cambiato dall'ultima compilazione, make stampa 'up to date' e non esegue alcuna operazione.
app: main.c math_utils.c
gcc main.c math_utils.c -o appRegole per la compilazione separata
Compilare ogni file oggetto separatamente significa che una modifica a un file ricompila solo quel file.
make segue il grafo delle dipendenze: modificando main.c, vengono eseguiti nuovamente solo main.o e il collegamento finale.
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
math_utils.o: math_utils.c math_utils.h
gcc -c math_utils.cVariabili
Le variabili eliminano le ripetizioni. Le si definisca all'inizio e le si espanda con $(NAME).
Ora cambiare il compilatore o i flag richiede una modifica in un solo punto.
CC = gcc
CFLAGS = -Wall -Wextra -g
app: main.o math_utils.o
$(CC) main.o math_utils.o -o appVariabili automatiche
make mette a disposizione abbreviazioni all'interno delle ricette:
$@— il nome del target$^— tutti i prerequisiti$<— il primo prerequisito
Permettono di mantenere le ricette brevi e corrette.
app: main.o math_utils.o
$(CC) $^ -o $@
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@Regole con pattern
Una sola regola con pattern compila ogni file .c nel corrispondente file .o, evitando di scrivere una regola per ogni file.
% corrisponde a qualsiasi parte variabile; combinato con $< e $@, rende la regola completamente generica.
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@Target phony
I target come clean non producono un file con quel nome. Li si dichiari .PHONY affinché make li esegua sempre, anche se esiste un file chiamato 'clean'.
clean rimuove gli artefatti della compilazione per forzare una nuova compilazione completa.
.PHONY: clean
clean:
rm -f *.o appUn Makefile completo
Mettiamo tutto insieme: variabili, una regola con pattern, una regola di collegamento e un target phony clean.
Questa struttura si adatta a molti file senza modifiche specifiche per ciascun file.
CC = gcc
CFLAGS = -Wall -Wextra -g
OBJS = main.o math_utils.o
app: $(OBJS)
$(CC) $^ -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJS) appCome decide make
make confronta i timestamp. Un target viene ricompilato se uno dei prerequisiti ha un orario di modifica più recente oppure se il target non esiste.
Per questo è importante elencare le dipendenze dagli header: modificando un header, ogni file oggetto che dipende da esso viene ricompilato correttamente.
Più target e target predefiniti
Il primo target di un Makefile è quello predefinito e viene eseguito quando si digita semplicemente make. Per convenzione si chiama all.
È inoltre possibile compilare un target specifico indicandone il nome, come make clean o make test, dando così a un solo Makefile diversi punti di accesso utili.
.PHONY: all
all: app
test: app
./app --selftestVerifica rapida
Individui la causa di un errore classico nei Makefile.
Riepilogo
Ora è possibile automatizzare le compilazioni con make:
- Le regole sono composte da target, prerequisiti e una ricetta con rientro tramite TAB
- Le variabili e le variabili automatiche (
$@ $^ $<) riducono le ripetizioni - Le regole con pattern (
%.o: %.c) gestiscono genericamente ogni file .PHONYcontrassegna i target che non sono file, comeclean- make ricompila solo ciò che non è aggiornato in base ai timestamp
Prossimo argomento: compilare librerie statiche e condivise.
Domande Frequenti
La lezione «Makefile» è gratuita?
Sì — il testo completo di «Makefile» è 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 «Makefile»?
Automatizzare la build 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 3 di 4.
Quanto tempo richiede la lezione «Makefile»?
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.