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 targetPierwszy 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 appReguł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.cZmienne
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 appZmienne 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 appKompletny 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) appJak 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 --selftestSzybkie 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 .PHONYoznacza cele niebędące plikami, takie jakclean- 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.