1

プロジェクトの一部である別のファイルを追加する必要がある場合は、すべてを機能させるために大幅に編集する必要があるmakefileがあります。makefileを一度コーディングして、それで完了したいと思います。だから、これはスクリプトです:

CC=g++
CFLAGS=-c -Wall

#All paths start in the main directory which has this makefile, object/ and code/.
OBJPATH=object#All compiled .o files need to be placed here.
CODEPATH=code#All .cpp and .hpp header files reside here.

#The names of all the object files that need to be made.
OBJ=$(OBJPATH)/World.o $(OBJPATH)/Block.o $(OBJPATH)/Creep.o $(OBJPATH)/Food.o $(OBJPATH)/Brick.o

all : World.a


$(OBJPATH)/World.o : $(CODEPATH)/World.hpp $(CODEPATH)/World.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/World.cpp
    mv World.o $(OBJPATH)/

$(OBJPATH)/Block.o : $(CODEPATH)/Block.hpp $(CODEPATH)/Block.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/Block.cpp
    mv Block.o $(OBJPATH)/

$(OBJPATH)/Creep.o : $(CODEPATH)/Creep.hpp $(CODEPATH)/Creep.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/Creep.cpp
    mv Creep.o $(OBJPATH)/

$(OBJPATH)/Food.o : $(CODEPATH)/Food.hpp $(CODEPATH)/Food.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/Food.cpp
    mv Food.o $(OBJPATH)/

$(OBJPATH)/Brick.o : $(CODEPATH)/Brick.hpp $(CODEPATH)/Brick.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/Brick.cpp
    mv Brick.o $(OBJPATH)/


#This archive is the final result of the compilation:
World.a : $(OBJ)
    ar rvs World.a $(OBJ)
    cp $(CODEPATH)/World.hpp . #I need both the World.a file and the World.hpp file from code/ for this library to function.


#Delete all object files and the archive:
clean : 
    rm $(OBJPATH)/*.o World.a World.hpp *~ $(CODEPATH)/*~

#Delete all backup files made by Gedit:
pretty :
    rm *~ $(CODEPATH)/*~

これが基本的に行うことは.o、フォルダ内のすべてのファイルをコンパイルしobject/てから、という名前のファイルにそれらを配置することですWorld.aWorld.hpp次に、それがライブラリのヘッダーファイルであるため、コピーします。このコードの多くは最小化できるので、より読みやすく一般的だと思います(新しいクラスを作成するたびに編集する必要はありません)。

4

1 に答える 1

2

1つのオブジェクトファイルのルールを見てください。

$(OBJPATH)/World.o : $(CODEPATH)/World.hpp $(CODEPATH)/World.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/World.cpp
    mv World.o $(OBJPATH)/

を使用する代わりに、必要な場所にオブジェクトを作成しましょうmv

$(OBJPATH)/World.o : $(CODEPATH)/World.hpp $(CODEPATH)/World.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/World.cpp -o $(OBJPATH)/World.o

次に、自動変数を使用します。

$(OBJPATH)/World.o : $(CODEPATH)/World.hpp $(CODEPATH)/World.cpp
    $(CC) $(CFLAGS) $(CODEPATH)/World.cpp -o $@

次に、前提条件の順序を逆にして、別の自動変数を使用できるようにします。

$(OBJPATH)/World.o : $(CODEPATH)/World.cpp $(CODEPATH)/World.hpp
    $(CC) $(CFLAGS) $< -o $@

これで、コマンドは名前で言及されないWorldため、すべてのオブジェクトに同じルールを使用できます。この答えを短くするために、最初に静的パターンルールにします。

$(OBJPATH)/World.o : $(OBJPATH)/%.o : $(CODEPATH)/%.cpp $(CODEPATH)/%.hpp
    $(CC) $(CFLAGS) $< -o $@

次に、それらをすべて組み合わせます。

OBJ=$(OBJPATH)/World.o $(OBJPATH)/Block.o $(OBJPATH)/Creep.o $(OBJPATH)/Food.o $(OBJPATH)/Brick.o

$(OBJ) : $(OBJPATH)/%.o : $(CODEPATH)/%.cpp $(CODEPATH)/%.hpp
    $(CC) $(CFLAGS) $< -o $@

これで、新しいファイルを追加するときに、そのファイルを行に追加するだけで済みますOBJ=...。改善できる点は他にもいくつかありますが、1日で十分です。

于 2012-09-20T17:47:26.670 に答える