为什么这不能使文件工作?

Why doesn't this make file work?

CC=g++
CFLAGS=-Wall -ggdb
OBJDIR=Objects
SRCDIR=Source
HDIR=Headers
OBJ=$(patsubst %,$(OBJDIR)/%,main.o vector.o obstacle.o \
        person.o simulation.o map.o wall.o room.o )

all: CrowdSim

CrowdSim: $(OBJ)
                    $(CC) $(CFLAGS) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.cc $(HDIR)/%.h
                    $(CC) $(CFLAGS) -c -o $@ $<

clean:
            rm -rf Objects/*.o Source/*.o

尝试制作时,我收到错误消息:“'CrowdSim' 不需要制作目标 'Objects/main.o' 的规则。注意:这是我第一次尝试制作文件,我正在关注示例 here.

附加信息:我所有的 .cc 文件都存储在 Source 中,我所有的 .h 文件都在 Headers 中,我想把我所有的 .o 文件都放在 Objects 中。

这样的规则:

$(OBJDIR)/%.o: $(SRCDIR)/%.cc $(HDIR)/%.h

需要两个先决条件都存在。如果其中一个不存在,则规则不匹配并且 make 将忽略它并寻找另一个规则。在这种情况下没有其他规则,因此 make 失败。

如果您不总是为 每个 .o 文件同时拥有 .cc.h 文件,那么您无法编写您的像这样规则。

相反,您必须像这样编写模式规则:

$(OBJDIR)/%.o: $(SRCDIR)/%.cc
        $(CC) $(CFLAGS) -c -o $@ $<

然后你必须单独声明 header 个文件,如下所示:

$(OBJDIR)/vector.o: $(HDIR)/vector.h

等对于任何 headers。您可能会考虑实现一种自动管理依赖项的方法,例如 this one.

顺便说一句,CCCFLAGS 用于 C 编译器。你在这里有 C++ 代码。按照惯例,在 makefile 中,对于 C++ 编译器,您应该使用 CXXCXXFLAGS