c++ - make: *** 没有规则来制作目标 'agenda.cpp','agenda' 需要。停止。#制作Makefile
问题描述
我有一个具有此文件结构的 C++ 项目:
包括文件:
src 文件:
为了编译它并运行,我正在尝试创建简单的 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.
我的猜测是它找不到议程.cpp 的路径,否则它不会要求制定规则。反正不确定,希望有人能解释一下。
EDIT.0:
我通过添加 vpath 编辑了 makefile,但仍然得到错误(新):
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 文件存储在构建文件夹中,没问题,除了议程.cpp(主文件),我没有得到我的可执行文件文件。但是得到了这个错误:
/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
我该如何解决这个问题?
解决方案
好吧,我做了这个Makefile
,它编译和运行得很好,如果有人需要它作为参考,只需在这里发布。
我使用的学习路径是:
GNU tutorials
(.text+0x20): undefined reference to `main' and undefined reference to function
C Linking Error: undefined reference to '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
推荐阅读
- r - 将“融化”的多列索引数据框转换为层次结构列表
- while-loop - csh 行等待文件中的文本行
- mongodb - Mongodb选择大于日期的文档
- qnamaker - QnAMaker 可以自动刷新它注入的 URL 内容吗
- excel - Excel VBA - 声明为整数的变量不保存整数值(运行时错误 1004)
- javascript - 如何使用数据组并在柱形图中显示结果?可能吗?
- python - 使用 Blender Python API 拍摄整个模型的图像
- c++ - 如何在 BFS (C++) 期间删除队列中的 obj?
- mysql - 从除最后一个 newsid 之外的所有类别中选择 5 个 newssid
- spring - 无法在 Kubernetes 中的一个 pod 内的容器之间连接