最近我已经从Windows和VisualStudio的阴暗面转向Linux,并且正努力使我的通用Makefile正常工作。我知道这可能很容易解决,但是我一直在阅读有关内容,并观看了几个小时的youtube视频,似乎无法发现/解决问题-请帮忙!
我所有的代码都放在同一个目录中(并且工作正常!),但变得有点麻烦,因此将其移至src目录,并将所有目标文件移至构建目录。这样,只有makefile和最终的可执行文件位于顶层。我收到一条错误消息:
make: *** No ruke to make target 'build/main.o', needed by 'testProg'. Stop.
我的makefile在下面。任何帮助将非常感激!提前致谢!
#Program Name:
PROG = testProg
CC = g++
CPPFLAGS = -c -g -Wall
LINKER = $(CC) -o
SRC_DIR = ./src
BUILD_DIR = ./build
# All source cpp files
SRCS = $(shell find $(SRC_DIR) -name *.cpp -or -name *.CPP)
# Substitute the .cpp for a .o for all entries in the $SRCS list.
OBJS_NAMES = $(subst .cpp,.o,$(SRCS))
OBJS = $(subst $(SRC_DIR),$(BUILD_DIR),$(OBJS_NAMES))
all: $(PROG)
$(PROG): $(OBJS)
$(CC) $(OBJS) -o $(PROG)
# Create object files
%.o: %.cpp
$(CC) $(CPPFLAGS) $< -o $@
clean:
rm -f $(PROG) $(OBJS)
#for debugging
show:
@echo 'Source files: ' $(SRCS)
@echo 'Object files: ' $(OBJS)
做make show
时,我得到输出:
Source files: ./src/main.cpp ./src/func1.cpp ...
Object files: ./build/main.o ./build/func1.o ...
答案 0 :(得分:3)
此规则:
%.o: %.cpp
$(CC) $(CPPFLAGS) $< -o $@
讲述如何从文件XXX.cpp构建文件XXX.o。 XXX(与%
匹配的部分)必须相同。
在新的makefile中,您尝试构建build/foo.o
,因此该规则仅在make可以找到要编译的build/foo.cpp
时才匹配。由于无法匹配,因此该规则不匹配,make也不知道如何构建build/foo.o
文件。
如果要将源文件和目标文件放在不同的目录中,则必须编写规则,以便拼出不相同的部分,如下所示:
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CC) $(CPPFLAGS) $< -o $@
顺便说一句,我建议您不要在上面使用subst
,因为这会替换 all 的所有出现,即使它们出现在单词的中间,这不太可能,但不会你要。我会用:
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
完全不需要OBJS_NAMES
。