2013-01-03 51 views
0
FLAGS:= -Wall -Wvla -g -lm 
OBJECT := Nominated.h UniversityNominated.h AliceGraduate.h BobGraduate.h CollegeNominated.h ColinGraduate.h DannyGraduate.h NominatedList.h Parser.h Parser.cpp 
all: Hire 

Nominated.o: Nominated.h Nominated.cpp 
    g++ -c $(FLAGS) Nominated.cpp -o Nominated.o 

NominatedList.o: Nominated.h NominatedList.h NominatedList.cpp 
    g++ -c $(FLAGS) NominatedList.cpp -o NominatedList.o 

UniversityNominated.o: Nominated.h UniversityNominated.h UniversityNominated.cpp 
    g++ -c $(FLAGS) UniversityNominated.cpp -o UniversityNominated.o 

AliceGraduate.o: Nominated.h UniversityNominated.h AliceGraduate.h AliceGraduate.cpp 
    g++ -c $(FLAGS) AliceGraduate.cpp -o AliceGraduate.o 

BobGraduate.o: Nominated.h UniversityNominated.h BobGraduate.h BobGraduate.cpp 
    g++ -c $(FLAGS) BobGraduate.cpp -o BobGraduate.o 

CollegeNominated.o: Nominated.h CollegeNominated.h CollegeNominated.cpp 
    g++ -c $(FLAGS) CollegeNominated.cpp -o CollegeNominated.o 

ColinGraduate.o: Nominated.h CollegeNominated.h ColinGraduate.h ColinGraduate.cpp 
    g++ -c $(FLAGS) ColinGraduate.cpp -o ColinGraduate.o 

DannyGraduate.o: Nominated.h CollegeNominated.h DannyGraduate.h DannyGraduate.cpp 
    g++ -c $(FLAGS) DannyGraduate.cpp -o DannyGraduate.o 

Parser.o: $(OBJECT) 
    g++ -c $(FLAGS) Parser.cpp -o Parser.o 

Parser: Nominated.o UniversityNominated.o AliceGraduate.o BobGraduate.o CollegeNominated.o ColinGraduate.o DannyGraduate.o NominatedList.o Parser.o 
    ar rcu libParser.a Nominated.o UniversityNominated.o AliceGraduate.o BobGraduate.o CollegeNominated.o ColinGraduate.o DannyGraduate.o NominatedList.o Parser.o 
    ranlib libParser.a 

Hire: Hire.cpp Parser 
    g++ Hire.cpp libParser.a -o Hire 

clean: 
    rm -f Hire *.a *.o *~ 
.PHONY: clean all 

所以這是我的Makefile。Makefile - 通配符,如何正確執行?

我該如何減少醜陋?

我總是讀到,但我不明白這個想法

怎麼樣?

我的意思我明白,我需要使用通配符工具,而是你我可能用錯了

回答

4

這裏有一個如何使用通配符和模式替換的例子:

SOURCES := $(wildcard *.cpp) 
OBJECTS := $(patsubst %.cpp,%.o,$(SOURCES)) 
CXX := g++ -Wall -Wvla -g 

.cpp.o: 
     ${CXX} -c $< 

這將構建所有將.cpp文件放入其對象文件中。

+0

但什麼頭?我不需要在我的makefile中使用它們? –

+0

您的編譯器應該有一個-MM選項來生成依賴關係。 – fuz

3

有很多事情你可以做,但最好的一個是pattern rule爲特定類型。你的所有物體似乎都是以同樣的方式構建的。

%.o: %.cpp 
    ${CXX} -c $(FLAGS) -o [email protected] $< 

您會注意到這不包括任何頭文件作爲依賴關係。手動維護Makefile中的頭文件依賴關係是一個壞主意,因爲在修改程序時它必然會過時。有時你的編譯器會自動爲你生成友好的依賴關係。假設你有對象的列表,像這樣:

OBJS := $(SOURCES:%.c=%.o) 

你可以在你的Makefile的最後包括這(與後沒有空行)

-include $(OBJS:.o=.d) 

然後加入,-MMD到你的編譯器標誌。這將導致GCC生成包含每個對象頭部依賴項的.d文件作爲Make規則,並且上面的include行將包含這些規則並使用它們來解析對象的依賴關係。這將意味着任何標題更改都將導致包含它的所有文件(直接或間接)被重建。

+0

我很抱歉,但我不明白。如果我必須包含頭文件'我該怎麼做? –

+0

@John,他意味着如果你的源文件依賴於任何其他文件,比如頭文件(通常他們會這樣做),你可以使用GCC來自動生成依賴關係。 –

1

試試這個:

FLAGS = -Wall -Wextra 
SRC  = $(wildcard *.cpp) 
OBJ  = $(patsubst %.cpp,%.o,$(SRC)) 
DEP  = $(patsubst %.cpp,%.d,$(SRC)) 
PARSER = $(filter-out Hire.o,$(OBJ)) 

all: $(DEP) build 

build: 
    make Hire 

%.d: 
    g++ -MM $*.cpp > $*.d 

%.o: %.cpp 
    g++ $(FLAGS) -c $*.cpp 

libParser.a: $(PARSER) 
    ar rcu libParser.a $(PARSER) 
    ranlib libParser.a 

Hire: Hire.cpp libParser.a 
    g++ Hire.cpp libParser.a -o Hire 

clean: 
    rm -f Hire *.a *.o *.d *~ 

.PHONY: clean all 

# 
# This line includes all the dependencies. 
# There is one for each file. 
# Check the *.d files after you run make 
-include $(DEP)