执行make时出错

LeFrillo

我正在尝试为我的项目创建一个makefile,但是在测试新事物时,似乎遇到了一些错误。我的文件结构是这样的:

~/main   #root project folder
    ~/main/include   #header files (mostly class headers)
    ~/main/src       #source files
    ~/main/src/obj   #object files
    Makefile

(Makefile在根项目文件夹中)

生成文件:

CC=g++

IDIR=include
SDIR=src
ODIR=src/obj

DEPS=$(IDIR)/%.h
OBJS=$(ODIR)/%.o
SRCS=$(SDIR)/%.cpp

CFLAGS=-Wall -std=c++11 -I$(IDIR)

$(OBJS): $(SRCS) $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

all: $(OBJS)
    gcc -o run $^ $(CFLAGS)

.PHONY: clean

clean:
    rm -f $(OBJS)

出于测试目的,我main.cppsrc文件夹中有一个in文件夹,文件夹中有一个随机头文件include运行简单make命令时出现的错误如下:

make: *** No rule to make target `src/obj/%.o', needed by `all'.  Stop.

编辑:在下面的人的帮助下,我想出了解决方案

CC=g++

IDIR=include
SDIR=src
ODIR=src/obj

CFLAGS=-Wall -std=c++11 -I$(IDIR)

_DEPS = yo.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = main.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

_SRC = main.cpp
SRC = $(patsubst %,$(SDIR)/%,$(_SRC))


$(ODIR)/%.o: $(SRC) $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

all: $(OBJ)
    $(CC) -o run $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(OBJS)
巴里

%在两种情况下,使用方法有所不同当你写的时候:

$(ODIR)/%.o : $(SDIR)/%.cpp $(IDIR)/%.h

它将进行模式替换,并创建一堆规则,例如:

$(ODIR)/foo.o : $(SDIR)/foo.cpp $(SDIR)/foo.h

这样就可以了,尽管您应该在%那里显式地使用它,以便清楚地看到规则在做什么。

但是当您在这里使用它时:

all : $(ODIR)/%.o

这实际上是在寻找$(ODIR)/%.o您没有规则的目标。没有替代。而且您没有制定该目标的规则-因此就是错误。您打算做的事情all取决于所有实际对象,您将需要使用该wildcard函数:

SOURCES = $(wildcard $(SDIR)/*.cpp)
OBJECTS = $(SOURCES:$(SDIR)/%.cpp=$(ODIR)/%.o)

all : $(OBJECTS)
    gcc -o run $^ $(CFLAGS)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章