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

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
revert
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ę main.test oraz składa się z czterech plików:
: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
<source lang="make">
# (właściwie wystarczy wpisać 'make' - all jest domyślny jako pierwszy cel)
CFLAGS = -c -g -O -o # tutaj można dodawać inne flagi kompilatora
CC = gcc
LIBS = -lm # tutaj można dodawać biblioteki
CC = gcc $(CFLAGS) # 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: pierwszy.o drugi.o trzeci.o czwarty.o
all: $(OUTFILE)
$(CC) pierwszy.o drugi.o trzeci.o czwarty.o -o test
pierwszy.o: pierwszy.c
clean:
$(CC) pierwszy.c rm-c -fo *pierwszy.o test
# pętla po plikach źródłowych...
.c.o:
$(CC) $*.o $< # $* to bieżący plik bez rozszerzenia, natomiast $< to bieżący plik
drugi.o: drugi.c
# pętla po plikach obiektowych...
$(CC) drugi.c -c -o drugi.o
.o:
OBJS = $(OBJS) $<
trzeci.o: trzeci.c
$(OUTFILE): $(OBJS)
$(CC) $(INCLUDES)trzeci.c $(OBJS)-c $(LIBS)-o $(OUTFILE)trzeci.o
</source>
czwarty.o: czwarty.c
Chyba nie muszę tłumaczyć tego kodu. Komentarze w kodzie zapewne wyjaśniają wszystkie linijki.
$(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.
 
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:
Linia 63 ⟶ 70:
@echo Usuwam gotowe pliki
@rm -f *.o test
 
Ten sam plik Makefile mógłby wyglądać inaczej:
 
CFLAGS = -c -g -O -o # tutaj można dodawać inne flagi kompilatora
LIBS = -lm # tutaj można dodawać biblioteki
OBJ =\
pierwszy.o \
drugi.o \
trzeci.o \
czwarty.o
all: main
clean:
rm -f *.o test
.c.o:
$(CC) -c $(INCLUDES) $(CFLAGS) $<
main: $(OBJ)
$(CC) $(OBJ) $(LIBS) -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.