CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
setleri sabit dizeleri olmak. $(CC)
görünür (örneğin), bu g++
OBJECTS=$(SOURCES:.cpp=.o)
ile değiştirilecektir yerde makefile'daki geri kalanı için, model .cpp
KAYNAKLARI bir deyişle görünür yerde hariç olmak üzere, KAYNAK ile aynı olacak şekilde değişken NESNELERİ ayarlar , onun .o
EXECUTABLE=hello
setleri başka sabit dize var
all: $(SOURCES) $(EXECUTABLE)
Th yerini makefile'de ilk gerçek kural, Bu all
oluşturmak için önce $(SOURCES)
ve $(EXECUTABLE)
içinde her şeyi inşa etmeli ve sonra hiçbir şey yapmamalarını söyler. bu ilk olduğundan, varsayılan hedef haline gelir, bu yüzden make
çalışan bir diğer kural make all
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]
eşdeğerdir: ilk $(OBJECTS)
her şeyi (main.o hello.o factorial.o
eşdeğeri) inşa etmek ve gereken (hello
genişler) $(EXECUTABLE)
oluşturmak için sonra komutu $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]
.cpp.o:
$(CC) $(CFLAGS) -o [email protected] $<
bir desen kuralı çalıştırın: komutunu çalıştırın daha sonra ilk, .o
biten bir dosya oluşturmak yeniden oluşturmak// .cpp biten ilgili dosyayı bulmak ve amacıyla $(CC) $(CFLAGS) -o [email protected] $<
.
Bu son iki kural
kural eylemlere geçerlidir ve
make
çalıştırdığınızda sırasıyla
yani, hepsi bu okur hedef ve birinci bağımlılık genişletmek özel değişkenler [email protected]
ve $<
içeren ve daha sonra inşa etmeye çalışır varsayılan hedef (tümü). Mevcut olmadığından, main.cpp, hello.cpp, factorial.cpp ve hello dosyalarını oluşturmaya çalışır. İlk 3'ten (muhtemelen) var olduğundan, onlar için kurallar/bağımlılıklar arar, ancak bulamazlar, bu yüzden onlar için hiçbir şey yapmayacağına karar verir. Var olmasaydı, "hedef yapmanın hiçbir kuralı" main.cpp '"
" merhaba "söz konusu olduğunda, ana.o, hello.o ve factorial.o'ya bağlıdır. Bu yüzden onlara bakar. Main.o için, pattern kuralı main.cpp'ye bağlı olduğunu, yani main.o yoksa veya main.cpp daha yeniyse, g++ -c -Wall -o main.o main.cpp
komutunu çalıştıracaktır. Aynı şey, hello.o ve factorial.o için de olur.
Bunlar yapıldıktan sonra, hello
yoksa ya da .o dosyalarından herhangi birinden daha eski (ki bu değişmiş olabilir, bu yüzden oldukça yeni olabilir), bu komutu yeniden başlatmak için çalıştıracaktır. Son olarak, boş komutu (hiçbir şey yapmadan) 'yeniden' inşa edecek.
Chris'in işaret ettiği gibi ilk satırlar shorthandleri tanımlamakta, geri kalanı ise 'bağımlılık grafiği' dir. Kaynak dosyalarınızı değiştirdiğinizde, make (make) sistemi, nihai sonuca ulaşmak için kuralları en altta çalıştırmaya başlar, sonuçta derlenen bir "up-to-date" yürütülebilir dosyasını yaratır. – Recct