“规则没有规则”,但规则存在

时间:2014-03-10 08:01:07

标签: c gcc makefile

我的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。我究竟做错了什么?

2 个答案:

答案 0 :(得分:4)

$(MAIN): $(OBJ_FOLDER)/%.o

完全请求%.o%在此处不作为模式,因为它不会出现在规则的两侧。您需要在那里使用$(OBJ)变量。但它首先需要修复,因为您只是替换扩展,但您也需要替换目录。

  1. 完成$(OBJ)变量(正如Lutin已经说过的那样)(好吧,但我修改了一下;我认为你只想要目录的直接后代):

    SRC = $(wildcard $(SRC_FOLDER)/*.cpp)
    OBJ = $(patsubst $(SRC_FOLDER)/%.cpp, $(OBJ_FOLDER)/%.o, $(SRC))
    
  2. 修改规则以实际使用 $(OBJ)变量:

    $(MAIN): $(OBJ)
    
  3. 哦,你很可能不要希望SRC_FOLDEROBJ_FOLDERBIN_FOLDER/开头因为它将它们放在文件系统根目录中,所以它不是您的项目所在的位置。对于上面的模式,它们不应该用斜杠结束

答案 1 :(得分:0)

适用于:

SRC = $(wildcard $(SRC_FOLDER)*/*.cpp $(SRC_FOLDER)*.cpp)
OBJ = $(patsubst $(SRC_FOLDER)%.cpp, $(OBJ_FOLDER)%.o, $(SRC))
相关问题