2
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 です。

どうすれば醜くなくなりますか?

私はいつもそれについて読んでいますが、私はその考えを得ることができません

どのように ?

つまり、ワイルドカードツールを使用する必要があることは理解していますが、あなたのように間違って使用した可能性があります

4

3 に答える 3

4

ワイルドカードとパターン置換を使用する方法の例を次に示します。

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

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

これにより、すべての .cpp ファイルがオブジェクト ファイルに組み込まれます。

于 2013-01-03T19:15:32.353 に答える
4

できることはたくさんありますが、最良の方法の 1 つは、特定の型のパターン ルールです。すべてのオブジェクトが同じ方法で構築されているようです。

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

これには、依存関係としてヘッダー ファイルが含まれていないことがわかります。Makefile でヘッダーの依存関係を手動で維持することは、プログラムを変更すると古くなってしまうため、悪い考えです。コンパイラが、make フレンドリな依存関係を自動的に生成する場合があります。次のようなオブジェクトのリストがあるとします。

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

これを Makefile の最後に含めることができます (その後に空白行はありません)。

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

-MMD次に、コンパイラ フラグに追加します。これにより、GCC は各オブジェクトのヘッダー依存関係を Make ルールとして含む .d ファイルを生成し、上記の include 行にはそれらのルールが含まれ、それらを使用してオブジェクトの依存関係を解決します。これは、ヘッダーが変更されると、それを含むすべてのファイルが (直接的または間接的に) 再構築されることを意味します。

于 2013-01-03T19:24:43.867 に答える
2

これを試して:

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)
于 2013-01-03T21:37:15.627 に答える