Makefile - 通配符,该怎么做呢?

时间:2013-01-03 18:57:28

标签: c++ c makefile

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。

我怎样才能减少丑陋?

我总是读到这个,但我无法理解

怎么样?

我的意思是我理解我需要使用通配符工具,但因为我可能使用了错误的

3 个答案:

答案 0 :(得分:4)

以下是如何使用通配符和模式替换的示例:

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

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

这会将所有.cpp文件构建到其目标文件中。

答案 1 :(得分:3)

你可以做很多事情,但最好的是针对特定类型的pattern rule。所有对象似乎都以相同的方式构建。

%.o: %.cpp
    ${CXX} -c $(FLAGS) -o $@ $<

您会注意到这不包含任何头文件作为依赖项。手动维护Makefile中的头依赖关系是个坏主意,因为在修改程序时它必然会过时。有时您的编译器可以自动为您生成make-friendly依赖项。假设您有一个对象列表,例如:

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

您可以在Makefile的最末端包含它(之后没有空行)

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

然后将-MMD添加到编译器标志中。这将导致GCC生成包含每个对象的头依赖项的.d文件作为Make规则,上面的include行将包含这些规则并使用它们来解析对象的依赖关系。这意味着任何标题更改都将导致重建包含它的所有文件(直接或间接)。

答案 2 :(得分: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)