C/Więcej o kompilowaniu: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Linia 32:
 
=== Przykładowy plik Makefile ===
Dość tej teorii, teraz zajmiemy się działającym przykładem. Załóżmy, że nasz przykładowy program nazywa się test oraz składa się z czterech plików:main.
:pierwszy.c
:drugi.c
:trzeci.c
:czwarty.c
Odpowiedni plik Makefile powinien wyglądać mniej więcej tak:
# Mój plik makefile - wpisz 'make all' aby skompilować cały program
# (właściwie wystarczy wpisać 'make' - all jest domyślny jako pierwszy cel)
CC = gcc
all: pierwszy.o drugi.o trzeci.o czwarty.o
$(CC) pierwszy.o drugi.o trzeci.o czwarty.o -o test
pierwszy.o: pierwszy.c
$(CC) pierwszy.c -c -o pierwszy.o
drugi.o: drugi.c
$(CC) drugi.c -c -o drugi.o
trzeci.o: trzeci.c
$(CC) trzeci.c -c -o trzeci.o
czwarty.o: czwarty.c
$(CC) czwarty.c -c -o czwarty.o
 
Widzimy, że nasz program zależy od 4 plików z rozszerzeniem .o (pierwszy.o itd.), potem każdy z tych plików zależy od plików .c, które program make skompiluje w pierwszej kolejności, a następnie połączy w jeden program (test). Nazwę kompilatora zapisaliśmy jako zmienną, ponieważ powtarza się i zmienna jest sposobem, by zmienić ją wszędzie za jednym zamachem.
 
Zatem jak widać używanie pliku Makefile jest bardzo proste. Warto na koniec naszego przykładu dodać regułę, która wyczyści katalog z plików .o:
 
clean:
rm -f *.o test
 
Ta reguła spowoduje usunięcie wszystkich plików .o oraz naszego programu jeśli napiszemy <tt>make clean</tt>.
 
Możemy też ukryć wykonywane komendy albo dopisać własny opis czynności:
clean:
@echo Usuwam gotowe pliki
@rm -f *.o test
 
Ten sam plik Makefile mógłby wyglądać inaczej:
<source lang="make">
CFLAGS = -c -g -O -o # tutaj można dodawać inne flagi kompilatora
LIBS = -lm # tutaj można dodawać biblioteki
CC = gcc $(INCLUDES) $(CFLAGS) $(LIBS) # tutaj można umieścić nazwę kompilatora
OUTFILE = main # tutaj można umieścić nazwę pliku wykonywalnego
OBJS = $(OUTFILE).o # początkowy plik wyjściowy
all: $(OUTFILE)
Linia 83 ⟶ 45:
clean:
rm -f *.o test
# pętla po plikach źródłowych...
.c.o:
$(CC) $*.o $< # $* to bieżący plik bez rozszerzenia, natomiast $< to bieżący plik
# pętla po plikach obiektowych...
.o:
OBJS = $(OBJS) $<
$(CC)OBJS $(OUTFILE)= $(OBJS) $(LIBS)<
$(OUTFILE): $(OBJS)
$(CC) $(INCLUDES) $(OBJS) $(LIBS) $(OUTFILE)
</source>
Chyba nie muszę tłumaczyć tego kodu. Komentarze w kodzie zapewne wyjaśniają wszystkie linijki.
 
Zatem jak widać używanie pliku Makefile jest bardzo proste. Warto na koniec naszego przykładu dodać regułę, która wyczyści katalog z plików .o:
 
Możemy też ukryć wykonywane komendy albo dopisać własny opis czynności:
clean:
@echo Usuwam gotowe pliki
@rm -f *.o test
 
Tak naprawdę jest to dopiero bardzo podstawowe wprowadzenie do używania programu make, jednak jest ono wystarczające, byś zaczął z niego korzystać. Wyczerpujące omówienie całego programu niestety przekracza zakres tego podręcznika.