make: *** Нет правила для создания цели 'повестки дня.cpp', необходимой для "повестки дня".Стоп.# Создание Makefile - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть проект C ++ с этой файловой структурой:

enter image description here

включаемые файлы:

enter image description here

src файлы:

enter image description here Чтобы скомпилировать и запустить, я пытаюсь создать простой Makefile.Пройдя несколько уроков, вот что я получил:

vpath %.hpp include
vpath %.cpp src
    agenda: agenda.cpp User.o Date.o Meeting.o Storage.o AgendaService.o AgendaUI.o
        g++ agenda.cpp User.o Date.o Meeting.o Storage.o AgendaService.o AgendaUI.o -o agenda

    User.o:User.hpp User.cpp
        g++ -c -std=c++11 User.cpp

    Date.o:Date.hpp Date.cpp
        g++ -c -std=c++11 Date.cpp

    Meeting.o:Meeting.hpp Meeting.cpp
        g++ -c -std=c++11 Meeting.cpp

    Storage.o:Storage.hpp Storage.cpp
        g++ -c -std=c++11 Storage.cpp

    AgendaService.o:AgendaService.hpp AgendaService.cpp
        g++ -c -std=c++11 AgendaService.cpp

    AgendaUI.o:AgendaUI.hpp AgendaUI.cpp
        g++ -c -std=c++11 AgendaUI.cpp

    clean:
        rm User.o Date.o Meeting.o Storage.o AgendaService.o AgendaUI.o  

И, кстати, основная функция здесь - это файл agenda.cpp.Таким образом, выполняя команду make, я получаю эту ошибку :

make: *** No rule to make target 'agenda.cpp', needed by 'agenda'.  Stop.  

Я думаю, что он не может найти путь к повестке дня.сделать правило.Во всяком случае, не уверен, надеюсь, кто-то может объяснить.
EDIT.0:
Я отредактировал make-файл, добавив vpath, но все равно получаю ошибку (new) :

g++ -c -std=c++11 User.cpp
g++: error: User.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [makefile:9: User.o] Error 1  

Похоже, в этот раз он нашел agenda.cpp и User.hpp, но не может найти User.cpp.Действительно был бы признателен за любую подсказку, работал над этим в течение длительного времени.

EDIT.1:

#VPATH = src:include
#CPPFLAGS = -I include
#vpath %.hpp include
#vpath %.cpp src

bin/agenda: build/User.o build/Date.o build/Meeting.o build/Storage.o build/AgendaService.o build/AgendaUI.o
    @mkdir -p bin   
    g++ -std=c++11 -w -I./include $^ -o $@

build/%.o: src/%.cpp
    @mkdir -p build
    g++ -std=c++11 -w -I./include -c -o $@ $<

clean: 
    @rm -rf build
    @rm -rf bin  

Потратив некоторое время на мой Makefile, это окончательный ответ, он прекрасно компилирует все файлы * .cpp, сохраняет objфайл в папке сборки, нет проблем, кроме повестки дня. файл (основной файл), я не получил свой исполняемый файл.Но получил эту ошибку:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [makefile:8: bin/agenda] Error 1  

Как я могу это исправить?

1 Ответ

0 голосов
/ 24 ноября 2018

Хорошо, я сделал это Makefile, и он прекрасно компилируется и работает, просто опубликуйте его здесь, если кому-то это понадобится в качестве ссылки.
Путь обучения, который я использовал:
Учебники по GNU
(. Text + 0x20): неопределенная ссылка на 'main' и неопределенная ссылка на функцию
C Ошибка соединения: неопределенная ссылка на 'main'

CC := g++
FLAGS := -std=c++11 -w
BIN_DIR := bin
INC_DIR := include
SRC_DIR := src
INCLUDE := -I./$(INC_DIR)
BUILD_DIR := build

$(BIN_DIR)/agenda: $(BUILD_DIR)/User.o $(BUILD_DIR)/Date.o $(BUILD_DIR)/Meeting.o $(BUILD_DIR)/Storage.o $(BUILD_DIR)/AgendaService.o $(BUILD_DIR)/AgendaUI.o $(BUILD_DIR)/agenda.o
    @mkdir -p $(BIN_DIR)    
    $(CC) $(FLAGS) $(INCLUDE) $^ -o $@

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
    @mkdir -p $(BUILD_DIR)
    $(CC) $(FLAGS) $(INCLUDE) -c -o $@ $<

clean: 
    @rm -rf build
    @rm -rf bin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...