Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ make:无法找到包含的用户定义头文件?_C++_Makefile - Fatal编程技术网

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

C++ make:无法找到包含的用户定义头文件?,c++,makefile,C++,Makefile,当我运行make时,会出现以下错误: make:**Menu.o所需的目标Menu.h'无规则生成。停止。 这是我的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_P

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

make:**Menu.o所需的目标Menu.h'无规则生成。停止。

这是我的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 $@
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 $@
对于单行输出很抱歉,我不知道如何以更可读的方式格式化。但正如您所见,包含
Menu.h
的目录data,被正确地包括在内。但由于某种原因,make无法找到它。这里可能出了什么问题

如果你需要更多信息,请告诉我

干杯

编译器知道如何找到该头文件。Make不知道如何找到它,Make是产生错误消息的人

我建议您进行以下修改:

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

vpath %.h $(INCLUDE_DIRS)
(请注意,您使用
当前路径
令人困惑,而且
数据/
是放置头文件的糟糕地方。)

编辑: 好的,让我们分阶段进行。步骤1,尝试此生成文件:

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 $^

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

如上所述,make的
vpath
不喜欢给定的绝对路径。有关我修改的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 $@
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 $@
PROG=sim
当前路径=~/Projects/restaurant/cpp/
CC=g++
CPPFLAGS=-g-v-Wall$(本地包括)-I$(BOOST\u根)
ODIR=bin
#vpath只需要SDIR和PKG_DIRS!
SDIR=src
PKG_DIRS=$(壳牌ls$(SDIR))
INCLUDE_DIRS=$(addprefix$(CURR_PATH)src/,$(PKG_DIRS))
本地包含=$(addprefix-I,$(包含目录))
FIND_SRC_FILES=$(notdir$(通配符$(SDIR)/$(pkg)/*.cpp))
SRC_文件=$(foreach pkg,$(pkg_DIRS),$(FIND_SRC_文件))
OBJ_文件=$(patsubst%.cpp、%.o、$(SRC_文件))
MAIN_OBJ=MAIN.o
vpath%.h$(addprefix$(SDIR)/,$(PKG_DIRS))
冒牌货:全部
进度:$(进度)
全部:$(信息$$CPPFLAGS是[${CPPFLAGS}])@echo Hello world
$(程序):$(OBJ_文件)
$(CC)$(CPPFLAGS)-o$(PROG)$(主对象)
%.o:%.cpp
$(CC)$(CPPFLAGS)-c$<-o$@
$(OBJ_文件):%.o:%.h

$(CC)$(CPPFLAGS)-c$(patsubs%.h,%.cpp,$我很感激这个建议,但这实际上对我不起作用。这可能与我定义变量的顺序有关吗?请原谅,我是一个努力学习的新手。我很感激对
CURR\u PATH
data/
的了解。我仍在努力区分between我的哪些头文件应该是私有的,哪些应该是公共的。你还可以建议我把我的私有头文件放在哪里?我刚刚想好了。你使用
vpath
肯定是对的,但是出于某种原因,绝对路径(即
CURR\u path
)这是问题的起因。我的推理来自中第20页的底部。我可能会补充说,这是一本很好的读物。