C &引用;“没有制定目标的规则”;尽管规则存在
我的makefile有一个问题,它说,C &引用;“没有制定目标的规则”;尽管规则存在,c,gcc,makefile,C,Gcc,Makefile,我的makefile有一个问题,它说,没有规则生成/bin/exec所需的target/obj/%.o。停止。但据我所知,我有: # 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/inc
没有规则生成/bin/exec所需的target/obj/%.o。停止。
但据我所知,我有:
# 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
#定义要使用的C编译器
CC=gcc
#定义任何编译时标志
#为调试模式添加-DDEBUG
CFLAGS=-Wall
#定义包含头文件的任何目录
INCLUDES=-I/INCLUDES
#定义src文件夹
SRC_文件夹=/SRC
#定义src文件
SRC=$(通配符$(SRC_文件夹)/%.cpp)
#定义对象文件夹
OBJ_文件夹=/OBJ
#定义obj文件
OBJ=$(patsubst%.cpp、%.o、$(SRC))
#定义二进制路径
BIN\u FOLFER=/BIN
#定义可执行文件
MAIN=$(BIN_FOLFER)/exec
#编译对象文件
$(OBJ_文件夹)/%.o:$(SRC_文件夹)/%.cpp
$(CC)$(CFLAGS)$<-o$@
#建造
$(主):$(对象文件夹)/%.o
$(CC)$(CFLAGS)$^-o$@
#清洁
.假冒:干净
清洁:
rm-f$(对象文件夹)/%.o
对于makefile中可能出现的任何重大错误,我深表歉意,这是我的第一个makefile。我做错了什么 它适用于:
SRC = $(wildcard $(SRC_FOLDER)*/*.cpp $(SRC_FOLDER)*.cpp)
OBJ = $(patsubst $(SRC_FOLDER)%.cpp, $(OBJ_FOLDER)%.o, $(SRC))
它的工作原理是:
SRC = $(wildcard $(SRC_FOLDER)*/*.cpp $(SRC_FOLDER)*.cpp)
OBJ = $(patsubst $(SRC_FOLDER)%.cpp, $(OBJ_FOLDER)%.o, $(SRC))
请求%.o
准确无误。%
在这里不作为模式,因为它不会出现在规则的两侧。您需要在那里使用$(OBJ)
变量。但是首先需要修复它,因为您只需要替换扩展名,但也需要替换目录
$(OBJ)
变量(正如Lutin已经说过的)(好的,但我对它做了一些修改;我想您只需要目录的直接后代):
$(OBJ)
变量:
$(MAIN): $(OBJ)
/
开始使用SRC_文件夹
、OBJ_文件夹
和BIN_文件夹
,因为这会将它们放在文件系统根目录中,而不是项目所在的位置。对于上面的模式,它们也不应该以斜杠结尾%.o
准确无误。%
在这里不作为模式,因为它不会出现在规则的两侧。您需要在那里使用$(OBJ)
变量。但是首先需要修复它,因为您只需要替换扩展名,但也需要替换目录
$(OBJ)
变量(正如Lutin已经说过的)(好的,但我对它做了一些修改;我想您只需要目录的直接后代):
$(OBJ)
变量:
$(MAIN): $(OBJ)
/
开始使用SRC_文件夹
、OBJ_文件夹
和BIN_文件夹
,因为这会将它们放在文件系统根目录中,而不是项目所在的位置。对于上面的模式,它们也不应该以斜杠结尾@是的,是的。所有目录都存在。我不确定规则的目标是否可以是绝对路径。您需要添加target
All:$(MAIN)
,然后运行make
@alexandrubarbosie如果删除此$(OBJ_文件夹)/%,会发生什么情况。o:$(SRC_文件夹)/%。cpp
规则?@qrdl没有帮助,相同的错误。leeduhem,我也有同样的错误。@leeduhem是的,有。所有目录都存在。我不确定规则的目标是否可以是绝对路径。您需要添加targetAll:$(MAIN)
,然后运行make
@alexandrubarbosie如果删除此$(OBJ_文件夹)/%,会发生什么情况。o:$(SRC_文件夹)/%。cpp
规则?@qrdl没有帮助,相同的错误。leeduhem,我也犯了同样的错误。