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
尝试制作时,我收到错误:&#34;没有规则可以制作目标&#39; Objects / main.o&#39;需要&#39; CrowdSim&#39;。注意:这是我第一次尝试使用makefile,我跟随示例here。
其他信息:我的所有.cc文件都存储在Source中,我的所有.h文件都在Headers中,我想将所有.o文件放在Objects中。
答案 0 :(得分:1)
这样的规则:
$(OBJDIR)/%.o: $(SRCDIR)/%.cc $(HDIR)/%.h
要求存在先决条件。如果其中任何一个不存在,则规则不匹配,make将忽略它并寻找另一个规则。在这种情况下,没有其他规则,因此make失败。
如果您不总是同时拥有每个 .cc
文件的.h
和.o
文件,那么您就不能像这样编写规则
相反,您必须像这样编写模式规则:
$(OBJDIR)/%.o: $(SRCDIR)/%.cc
$(CC) $(CFLAGS) -c -o $@ $<
然后你必须单独声明头文件,如下所示:
$(OBJDIR)/vector.o: $(HDIR)/vector.h
等。对于任何标题。您可以考虑实现一种自动管理依赖关系的方法,例如this one.
顺便说一句,CC
和CFLAGS
适用于C编译器。你这里有C ++代码。按照惯例,在makefile中,您应该使用CXX
和CXXFLAGS
来进行C ++编译器。