为什么这个文件不起作用?

时间:2015-03-08 03:59:28

标签: makefile

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中。

1 个答案:

答案 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.

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