我正在尝试为我的项目创建一个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.cpp
在src
文件夹中有一个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] 删除。
我来说两句