make:无法找到包含的用户定义的头文件?

时间:2020-02-07 21:28:28

标签: c++ makefile

运行make时,出现以下错误:

make: *** No rule to make target Menu.h', needed by Menu.o'. Stop.

这是我的Makefile:

PROG = sim
CURR_PATH = ~/Projects/restaurant/cpp/
CC = g++
CPPFLAGS = -g -v -Wall $(LOCAL_INCLUDES) -I$(BOOST_ROOT)
ODIR = ./bin
SDIR = ./src
LOCAL_INCLUDES = $(patsubst %,-I$(CURR_PATH)src/%,$(PKG_DIRS))
PKG_DIRS = $(shell ls $(SDIR))
FIND_SRC_FILES = $(notdir $(wildcard $(SDIR)/$(pkg)/*.cpp))
SRC_FILES = $(foreach pkg,$(PKG_DIRS),$(FIND_SRC_FILES))
OBJ_FILES = $(patsubst %.cpp,%.o,$(SRC_FILES))
MAIN_OBJ = main.o

.PHONY : prog

prog : $(PROG)

all : ; $(info $$CPPFLAGS is [${CPPFLAGS}])@echo Hello world

$(PROG) : $(OBJ_FILES)
    $(CC) $(CPPFLAGS) -o $(PROG) $(MAIN_OBJ)
%.o : %.cpp
    $(CC) $(CPPFLAGS) -c $< -o $@
$(OBJ_FILES) : %.o : %.h
    $(CC) $(CPPFLAGS) -c $(patsubst %.h,%.cpp,$<) -o $@

顺便说一句,如果您想知道LOCAL_INCLUDES是什么样子,那么“ all”配方的输出如下:

$CPPFLAGS is [-g -v -Wall -I~/Projects/restaurant/cpp/src/concurrent -I~/Projects/restaurant/cpp/src/containers -I~/Projects/restaurant/cpp/src/data -I~/Projects/restaurant/cpp/src/loader -I~/Projects/restaurant/cpp/src/main -I~/Projects/restaurant/cpp/src/people -I~/Projects/restaurant/cpp/src/sim -I/usr/local/boost_1_72_0]
Hello world

很抱歉,对于单行输出,我不知道如何以更易读的方式设置格式。但是如您所见,包含Menu.h的目录数据已被正确包含。但是由于某种原因,make无法找到它。这里可能出什么问题了?

让我知道是否需要更多信息。

欢呼

2 个答案:

答案 0 :(得分:0)

编译器知道如何查找该头文件。 制作不知道如何找到它,而Make就是生成该错误消息的人。

我建议您进行以下修改:

INCLUDE_DIRS = $(addprefix $(CURR_PATH)src/,$(PKG_DIRS))
LOCAL_INCLUDES = $(addprefix -I,$(INCLUDE_DIRS))

vpath %.h $(INCLUDE_DIRS)

(P.S。您对CURR_PATH.的使用令人困惑,而data/是放置头文件的糟糕地方。)

编辑: 好吧,让我们分阶段进行。步骤1,尝试使用此Makefile:

OBJ_FILES = Menu.o

INCLUDE_DIRS = ~/Projects/restaurant/cpp/src/data

vpath %.h $(INCLUDE_DIRS)

Menu.o:

$(OBJ_FILES) : %.o : %.cpp %.h
    @echo building $@ from $^

告诉我们会发生什么。 (如果它不起作用,请告诉我们发生了什么。)

答案 1 :(得分:0)

如上所述,make的vpath不喜欢给出的绝对路径。修改后的Makefile见下文:

PROG = sim
CURR_PATH = ~/Projects/restaurant/cpp/
CC = g++
CPPFLAGS = -g -v -Wall $(LOCAL_INCLUDES) -I$(BOOST_ROOT)
ODIR = bin

# vpath only needs SDIR and PKG_DIRS! 
SDIR = src

PKG_DIRS = $(shell ls $(SDIR))
INCLUDE_DIRS = $(addprefix $(CURR_PATH)src/,$(PKG_DIRS))
LOCAL_INCLUDES = $(addprefix -I,$(INCLUDE_DIRS))
FIND_SRC_FILES = $(notdir $(wildcard $(SDIR)/$(pkg)/*.cpp))
SRC_FILES = $(foreach pkg,$(PKG_DIRS),$(FIND_SRC_FILES))
OBJ_FILES = $(patsubst %.cpp,%.o,$(SRC_FILES))
MAIN_OBJ = main.o

vpath %.h $(addprefix $(SDIR)/,$(PKG_DIRS))

.PHONY : all

prog : $(PROG)

all : ; $(info $$CPPFLAGS is [${CPPFLAGS}])@echo Hello world

$(PROG) : $(OBJ_FILES)
        $(CC) $(CPPFLAGS) -o $(PROG) $(MAIN_OBJ)
%.o : %.cpp
        $(CC) $(CPPFLAGS) -c $< -o $@
$(OBJ_FILES) : %.o : %.h
        $(CC) $(CPPFLAGS) -c $(patsubst %.h,%.cpp,$<) -o $@

我希望这对遇到类似问题的其他人有所帮助。