【问题标题】:make: *** No rule to make target 'agenda.cpp', needed by 'agenda'. Stop. #Making Makefilemake: *** 没有规则来制作目标 'agenda.cpp','agenda' 需要。停止。 #制作Makefile
【发布时间】:2018-11-23 11:27:23
【问题描述】:

我有一个具有这种文件结构的 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,但仍然得到 error(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.cppUser.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 文件存储在 build 文件夹中,没问题,除了议程.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 在同一目录中没有agenda.cpp 文件。另一方面,有一个src/agenda.cpp 文件。你所有的文件都有同样的问题。我认为您需要多花一点时间在the make documentation 上。当你这样做时,我还建议你更多地了解隐式规则,这意味着你不必列出构建所有目标文件的命令。
  • 你的意思是无论makefile在哪里,它都是一个起点?在每个 .cpp 和 .hpp 文件之前,我应该添加类似 src/file_name.cpp 的路径?@Someprogrammerdude
  • 当然,只是文件结构是这个作业的要求 idk @Someprogrammerdude
  • 你也可以使用vpath %.hpp srcvpath %.cpp src
  • vpath 是一个高级 Makefile 使用,经常做错,不要从那个开始。对于头文件,将“-I include”传递给 g++,对于 cpp 文件,使用完整路径,例如src/用户.cpp。您还应该制作一个议程.o 并添加一个单独的链接器阶段。一旦可行,请查看模式规则:例如 %.o: %.cpp。

标签: c++ makefile


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多