2011-02-23 22 views
15

Bu makefile bu site üzerinde bulundu. Bu örneği açıklamıyorlar, bu yüzden neler olup bittiğini merak ediyordum. Dört değişkenBirisi bu make dosyasını açıklayabilir mi?

CC=g++ 
CFLAGS=-c -Wall 
LDFLAGS= 
SOURCES=main.cpp hello.cpp factorial.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=hello 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 
+0

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

cevap

28
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.

+0

Anlamadığım tek şey, neden desen kuralında gerekli olduğunu tekrar çağırmaktır '-o $ @ '. Bunu bana açıklayabilir misin? Teşekkürler – Kyrol

+0

@Kyrol: '-o', yazılacak dosyanın adını belirtir. Bazı derleyicilerde, varsayılan çıktı dosyası zaten hedefle aynı olabilir, ancak yeniden belirleme zarar görmez. –

+0

Değil .cpp.o: 'bir Sonek Kuralı ve bir Desen Kuralı değil mi? – jdknight

İlgili konular