我的makefile有问题No rule to make target /obj/%.o, needed by /bin/exec. Stop.
但是据我所知,我有它:
# define the C compiler to use
CC = gcc
# define any compile-time flags
# add -DDEBUG for debug mode
CFLAGS = -Wall
# define any directories containing header files
INCLUDES = -I/includes
# define src folder
SRC_FOLDER = /src
# define src files
SRC = $(wildcard $(SRC_FOLDER)/%.cpp)
# define object folder
OBJ_FOLDER = /obj
# define obj files
OBJ = $(patsubst %.cpp, %.o, $(SRC))
# define binary path
BIN_FOLFER = /bin
# define the executable file
MAIN = $(BIN_FOLFER)/exec
# compile object files
$(OBJ_FOLDER)/%.o: $(SRC_FOLDER)/%.cpp
$(CC) $(CFLAGS) $< -o $@
# build
$(MAIN): $(OBJ_FOLDER)/%.o
$(CC) $(CFLAGS) $^ -o $@
# cleaning
.PHONY: clean
clean:
rm -f $(OBJ_FOLDER)/%.o
我很抱歉makefile中可能出现任何重大错误,这是我的第一个makefile。我究竟做错了什么?
答案 0 :(得分:4)
$(MAIN): $(OBJ_FOLDER)/%.o
完全请求%.o
。 %
在此处不作为模式,因为它不会出现在规则的两侧。您需要在那里使用$(OBJ)
变量。但它首先需要修复,因为您只是替换扩展,但您也需要替换目录。
完成$(OBJ)
变量(正如Lutin已经说过的那样)(好吧,但我修改了一下;我认为你只想要目录的直接后代):
SRC = $(wildcard $(SRC_FOLDER)/*.cpp)
OBJ = $(patsubst $(SRC_FOLDER)/%.cpp, $(OBJ_FOLDER)/%.o, $(SRC))
修改规则以实际使用 $(OBJ)
变量:
$(MAIN): $(OBJ)
哦,你很可能不要希望SRC_FOLDER
,OBJ_FOLDER
和BIN_FOLDER
以/
开头因为它将它们放在文件系统根目录中,所以它不是您的项目所在的位置。对于上面的模式,它们不应该用斜杠结束。
答案 1 :(得分:0)
适用于:
SRC = $(wildcard $(SRC_FOLDER)*/*.cpp $(SRC_FOLDER)*.cpp)
OBJ = $(patsubst $(SRC_FOLDER)%.cpp, $(OBJ_FOLDER)%.o, $(SRC))