gpt4 book ai didi

c++ - 执行make时出错

转载 作者:行者123 更新时间:2023-11-30 02:31:59 24 4
gpt4 key购买 nike

我正在尝试为我的项目创建一个 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)

出于测试目的,我在 src 文件夹中有一个 main.cpp,在 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)

关于c++ - 执行make时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36944256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com