我最近从 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 ...
最佳答案
这条规则:
%.o: %.cpp
$(CC) $(CPPFLAGS) $< -o $@
告诉 make 如何从文件 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
,因为它会替换所有 出现,即使它们出现在不太可能但不会出现的单词中间也是如此。不是你想要的。我会使用:
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
根本不需要OBJS_NAMES
。
关于c++ - 与一般的 makefile 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352732/