0Pricing
C Academy · Lekcja

Makefile

Automatyzowanie budowania

Makefile to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Dlaczego warto używać plików Makefile

Ręczne wpisywanie poleceń gcc szybko staje się nie do opanowania. make odczytuje plik Makefile opisujący sposób budowania projektu i uruchamia tylko potrzebne polecenia.

Jego najważniejsza zaleta: ponownie buduje plik tylko wtedy, gdy jego dane wejściowe są nowsze od wyniku, oszczędzając ogromną ilość czasu kompilacji.

Budowa reguły

Reguła składa się z trzech części: celu, jego zależności oraz przepisu.

Wiersz przepisu MUSI zaczynać się prawdziwym znakiem TAB, a nie spacjami. To najczęstszy błąd w plikach Makefile.

target: prerequisite1 prerequisite2
	<TAB>command to build target

Pierwszy plik Makefile

Ten plik buduje app z dwóch plików źródłowych. Uruchomienie make bez argumentu buduje pierwszy cel.

Jeśli od ostatniego budowania żaden z plików źródłowych się nie zmienił, make wypisuje „up to date” i nic nie robi.

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

Reguły oddzielnej kompilacji

Budowanie każdego pliku obiektowego osobno oznacza, że zmiana w jednym pliku powoduje ponowną kompilację tylko tego pliku.

make korzysta z grafu zależności: po zmianie main.c ponownie uruchamiane jest tylko budowanie main.o oraz końcowa konsolidacja.

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

Zmienne

Zmienne eliminują powtórzenia. Należy zdefiniować je na początku i rozwijać za pomocą $(NAME).

Od tej pory zmiana kompilatora lub flag odbywa się w jednym miejscu.

CC = gcc
CFLAGS = -Wall -Wextra -g

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

Zmienne automatyczne

make udostępnia skrócone oznaczenia używane w przepisach:

  • $@ — nazwa celu
  • $^ — wszystkie zależności
  • $< — pierwsza zależność

Dzięki nim przepisy są krótkie i poprawne.

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

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

Reguły wzorcowe

Jedna reguła wzorcowa kompiluje każdy plik .c do odpowiadającego mu pliku .o, dzięki czemu nie trzeba pisać osobnej reguły dla każdego pliku.

% dopasowuje dowolny rdzeń nazwy; w połączeniu z $< i $@ reguła jest w pełni uniwersalna.

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

Cele pozorne

Cele takie jak clean nie tworzą pliku o tej nazwie. Należy zadeklarować je jako .PHONY, aby make zawsze je uruchamiał, nawet jeśli istnieje plik o nazwie „clean”.

clean usuwa artefakty budowania, wymuszając ponowne budowanie od początku.

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

Kompletny plik Makefile

Połączmy wszystko: zmienne, regułę wzorcową, regułę konsolidacji oraz pozorny cel clean.

Takie rozwiązanie można rozszerzać na wiele plików bez edytowania reguł dla poszczególnych plików.

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

Jak make podejmuje decyzje

make porównuje znaczniki czasu. Cel jest budowany ponownie, jeśli dowolna zależność ma nowszy czas modyfikacji albo jeśli cel nie istnieje.

Dlatego ważne jest wyszczególnienie zależności nagłówków: po edycji nagłówka każdy zależny plik obiektowy zostanie poprawnie zbudowany ponownie.

Wiele celów i cele domyślne

Pierwszy cel w pliku Makefile jest domyślny i zostaje uruchomiony po wpisaniu samego make. Zgodnie z konwencją nazywa się all.

Można także zbudować konkretny cel po nazwie, na przykład make clean lub make test, dzięki czemu jeden plik Makefile udostępnia wiele przydatnych punktów wejścia.

.PHONY: all
all: app

test: app
	./app --selftest

Szybkie sprawdzenie

Zdiagnozuj klasyczny błąd w pliku Makefile.

Podsumowanie

Potrafi już Pan/Pani automatyzować budowanie za pomocą make:

  • Reguły składają się z celu, zależności i przepisu poprzedzonego tabulatorem
  • Zmienne i zmienne automatyczne ($@ $^ $<) ograniczają powtórzenia
  • Reguły wzorcowe (%.o: %.c) obsługują dowolne pliki w sposób uniwersalny
  • .PHONY oznacza cele niebędące plikami, takie jak clean
  • make ponownie buduje tylko elementy nieaktualne, korzystając ze znaczników czasu

Następnie: budowanie bibliotek statycznych i współdzielonych.

Często zadawane pytania

Czy lekcja „Makefile” jest bezpłatna?

Tak — pełny tekst „Makefile” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Makefile”?

Automatyzowanie budowania Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Makefile”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kompilacja warunkowa
  2. Projekty wieloplikowe
  3. Makefile
  4. Biblioteki statyczne i współdzielone
← Powrót do C Academy