C Academy · Lektion

Makefiles

Automatisér build-processen

Lektion 3 af 413 trin

Makefiles er en gratis C Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.

Hvorfor Makefiles

Det bliver hurtigt uoverskueligt at skrive gcc-kommandoer manuelt. make læser en Makefile, der beskriver, hvordan projektet skal bygges, og kører kun de nødvendige kommandoer.

Den vigtigste funktion er, at den kun bygger en fil igen, når dens input er nyere end outputtet, så du sparer meget kompileringstid.

En regels opbygning

En regel har tre dele: et mål, dets forudsætninger og en opskrift.

Opskriftslinjen SKAL begynde med et rigtigt TAB-tegn, ikke mellemrum. Det er den mest almindelige Makefile-fejl.

target: prerequisite1 prerequisite2
	<TAB>command to build target

En første Makefile

Denne bygger app ud fra to kildefiler. Når du kører make uden argumenter, bygges det første mål.

Hvis ingen af kildefilerne er ændret siden det seneste build, skriver make 'up to date' og gør ingenting.

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

Regler for separat kompilering

Når hvert objekt bygges separat, betyder en ændring i én fil, at kun den fil kompileres igen.

make følger afhængighedsgrafen: Ændr main.c, så køres kun main.o og det endelige link igen.

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.c

Variable

Variable fjerner gentagelser. Definér dem øverst, og udvid dem med $(NAME).

Nu foregår ændringer af compileren eller flagene ét sted.

CC = gcc
CFLAGS = -Wall -Wextra -g

app: main.o math_utils.o
	$(CC) main.o math_utils.o -o app

Automatiske variable

make stiller forkortelser til rådighed i opskrifter:

  • $@ — målets navn
  • $^ — alle forudsætninger
  • $< — den første forudsætning

De holder opskrifterne korte og korrekte.

app: main.o math_utils.o
	$(CC) $^ -o $@

main.o: main.c
	$(CC) $(CFLAGS) -c $< -o $@

Mønsterregler

Én mønsterregel kompilerer alle .c-filer til deres .o-filer, så du slipper for at skrive en regel for hver fil.

% matcher enhver stamme; kombineret med $< og $@ er reglen helt generisk.

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

Fiktive mål

Mål som clean producerer ikke en fil med det navn. Deklarér dem som .PHONY, så make altid kører dem, selv hvis der findes en fil med navnet 'clean'.

clean fjerner build-artefakter for at gennemtvinge et nyt build.

.PHONY: clean
clean:
	rm -f *.o app

En komplet Makefile

Her samler vi det hele: variable, en mønsterregel, en linkregel og et fiktivt clean-mål.

Det kan skaleres til mange filer uden ændringer for hver enkelt fil.

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) app

Sådan træffer make beslutninger

make sammenligner tidsstempler. Et mål bygges igen, hvis en af forudsætningerne har et nyere ændringstidspunkt, eller hvis målet ikke findes.

Derfor er det vigtigt at angive headerafhængigheder: Redigér en headerfil, så bygges alle afhængige objekter korrekt igen.

Flere mål og standardmål

Det første mål i en Makefile er standardmålet, som køres, når du skriver almindelig make. Det kaldes normalt all.

Du kan også bygge et bestemt mål ved navn, f.eks. make clean eller make test, så én Makefile får mange nyttige indgange.

.PHONY: all
all: app

test: app
	./app --selftest

Hurtigt tjek

Find årsagen til en klassisk Makefile-fejl.

Opsummering

Du kan nu automatisere builds med make:

  • Regler består af et mål, forudsætninger og en TAB-indrykket opskrift
  • Variable og automatiske variable ($@ $^ $<) reducerer gentagelser
  • Mønsterregler (%.o: %.c) håndterer alle filer generisk
  • .PHONY markerer mål, der ikke er filer, som f.eks. clean
  • make bygger kun det, der er forældet, igen ud fra tidsstempler

Næste trin: bygning af statiske og delte biblioteker.

Gratis at komme i gang

Lær C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
144

Ofte stillede spørgsmål

Er lektionen “Makefiles” gratis?

Ja — hele teksten til “Makefiles” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Makefiles”?

Automatisér build-processen Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C Academy?

Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Makefiles”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C Academy-lektion?

Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Betinget kompilering
  2. Projekter med flere filer
  3. Makefiles
  4. Statiske og shared libraries
← Tilbage til C Academy