我在这个Makefile上工作了几个小时,似乎没有任何更改在起作用,但对我来说似乎完全没问题。也许我缺少一些基本的东西?
这是目录的外观:
project
makefile
\obj
checkInput.cpp
olend.cpp
\include
checkInput.h
这是makefile:
I_DIR = include
OBJ_DIR = obj
CXX = g++
CXXFLAGS = -I$(I_DIR)
MAIN = olend
SRCS = checkInput.cpp
OBJ_SRCS = $(subst .cpp, .o, $(SRCS)), $(MAIN).o
OBJS = $(patsubst %, $(OBJ_DIR)/%, $(OBJ_SRCS))
DEP_SRCS = $(subst .cpp,.h,$(SRCS))
DEPS = $(patsubst %,$(I_DIR)/%,$(DEP_SRCS))
all: $(MAIN)
$(MAIN): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(MAIN) $(OBJS)
$(OBJ_DIR)/%.o: %.cpp $(DEPS)
$(CXX) $(CXXFLAGS) -o $@ $<
.PHONY: clean
clean:
rm -f $(OBJ_DIR)/*.o $(MAIN)
我正在寻找可执行文件“olend”,而我目前遇到的错误是,
"No rule to make target 'obj/olend.o,', needed by `olend'. Stop."
这是非常直接的错误,但我不知道该怎么可能发生,
$(OBJ_DIR)/%.o
应该包括obj/olend.o
作为目标。任何帮助将不胜感激! 最佳答案
如果仔细查看错误消息,它会指出找不到的目标是'obj / olend.o',-请注意结尾处的逗号。这来自您定义OBJ_SRCS
变量的方式。它看起来应该像这样:
OBJ_SRCS = $(subst .cpp,.o, $(SRCS)) $(MAIN).o
请注意,
.o
之前没有空格(这导致它生成诸如checkInput .o
的文件名),并且在$(MAIN)
部分之前没有逗号(这导致其生成了诸如checkInput.o, olend.o
之类的东西)。