为什么这不能使文件工作?
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.
顺便说一句,CC
和 CFLAGS
用于 C 编译器。你在这里有 C++ 代码。按照惯例,在 makefile 中,对于 C++ 编译器,您应该使用 CXX
和 CXXFLAGS
。
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.
顺便说一句,CC
和 CFLAGS
用于 C 编译器。你在这里有 C++ 代码。按照惯例,在 makefile 中,对于 C++ 编译器,您应该使用 CXX
和 CXXFLAGS
。