如何使我的makefile更通用?

如何使我的makefile更通用?,makefile,Makefile,我有一个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. COD

我有一个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)/*~

这主要是编译文件夹
object/
中的所有
.o
文件,然后将它们放入名为
World.a
的文件中。然后它只是复制到
World.hpp
,因为那是库的头文件。我相信这些代码中的很多都可以最小化,因此更具可读性和通用性(不需要每次创建新类时都对其进行编辑)。

查看一个对象文件的规则:

$(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 $@
然后颠倒先决条件的顺序,以便我们可以使用另一个自动变量:

$(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 $@
然后将它们结合起来:

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=$(OBJPATH)/World.o$(OBJPATH)/Block.o$(OBJPATH)/screet.o$(OBJPATH)/Food.o$(OBJPATH)/Brick.o
$(OBJ):$(OBJPATH)/%.o:$(代码路径)/%.cpp$(代码路径)/%.hpp
$(CC)$(CFLAGS)$<-o$@

现在,当您想要添加一个新文件时,您所要做的就是将其添加到
OBJ=…
行中。您还可以进行一些改进,但这一天就足够了。

您使用的make版本是什么?(我希望是GNUMake。)Ubuntu附带的默认版本。我现在不在家,所以我不能马上检查。