make: невозможно найти определяемый пользователем заголовочный файл, который включен? - PullRequest
0 голосов
/ 08 февраля 2020

Когда я запускаю 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

Извините за вывод в одну строку, я не знаю, как форматировать более читабельным способом. Но, как вы видите, каталог data , который содержит Menu.h, корректно включен. Но по какой-то причине make не может его найти. Что может быть не так?

Дайте мне знать, если вам нужна дополнительная информация.

Приветствия

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Как уже упоминалось, make's 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 $@

Я надеюсь, что это поможет другим людям, которые сталкиваются с подобными проблемами.

0 голосов
/ 08 февраля 2020

Компилятор знает, как найти этот заголовочный файл. Make не знает, как его найти, и именно Make выдает это сообщение об ошибке.

Я предлагаю вам сделать это изменение:

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

vpath %.h $(INCLUDE_DIRS)

(PS Ваш использование CURR_PATH и . сбивает с толку, а data/ - ужасное место для размещения заголовочных файлов.)

EDIT: Хорошо, давайте рассмотрим это поэтапно. Шаг 1, попробуйте этот make-файл:

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

и расскажите нам, что происходит. (Если это не сработает, скажите нам, что происходит.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...