C++ Main的Makefile未定义引用(尝试了StackOverflow上的其他帖子)

C++ Main的Makefile未定义引用(尝试了StackOverflow上的其他帖子),c++,makefile,C++,Makefile,我已经试过这些建议了。我移动到makefile所在的目录中,运行它,并得到多个未定义的引用错误: 我的文件目录如下所示 makefile 版本3box(目录) SharedCppFiles(目录) Box.cpp(#包括“Box.h”) SharedHeaders(目录) 方框h(#包括) Snake(目录) CPP文件(目录) GridPiece.cpp(#包括“Box.cpp”、“Box.h”、“GridPiece.h”) main.cpp(#包括“Box.h”、“GridPiece.cpp

我已经试过这些建议了。我移动到makefile所在的目录中,运行它,并得到多个未定义的引用错误:

我的文件目录如下所示

makefile
版本3box(目录)
SharedCppFiles(目录)
Box.cpp(#包括“Box.h”)
SharedHeaders(目录)
方框h(#包括)
Snake(目录)
CPP文件(目录)
GridPiece.cpp(#包括“Box.cpp”、“Box.h”、“GridPiece.h”)
main.cpp(#包括“Box.h”、“GridPiece.cpp”、“GridPiece.h”)
标题(目录)
GridPiece.h(#包括“Box.h”)
这是我的makefile:

#指定最终目标名称
EXE:=蛇类游戏
#指定源文件
#有效地列出当前目录中的所有源文件
SRC:=$(通配符*.cpp)\
$(通配符../*.cpp)
#从源文件列表中,获取相应的对象文件列表
对象:=$(SRC:.cpp=.o)
#从对象文件列表中,获取依赖项文件列表以处理自动重新编译
#修改头文件时
部门:=$(对象:.o=.d)
#指定预处理器标志(这是一个内置变量)
CPPFLAGS:=-I../Include
#启用编译器自动生成依赖项所需的标志
CPPFLAGS+=-MMD-MP
#指定编译器标志(这是一个内置变量)
#基本警告标志
CFLAGS:=-Wall-W-pedantic
#指定链接器标志(这是一个内置变量)
LDFLAGS:=-L../lib-Llib/sfml/lib-lsfml图形-lsfml窗口-lsfml系统
#指定链接器库(这是一个内置变量)
LDLIBS:=-lm
#告诉make这些目标不是真实的文件
.骗子:都是干净的
#现在是标准的基本规则
全部:$(EXE)
#我们如何制作$(EXE)?记住描述链接阶段的配方
$(EXE):$(OBJ)
$(CC)$(LDFLAGS)$^$(LDLIBS)-o$@
#让我们收拾一下
清洁:
$(RM)$(EXE)$(OBJ)$(DEP)
#不要忘记包含依赖项文件,以便知道何时重新编译
-包括美元(DEP)
有人能帮我解决这段代码的问题吗,或者生成一个与此类似的makefile?与我目前的能力相比,我也在努力学习如何编写更好的makefile。非常感谢你


很抱歉,我添加了另一个未定义的对SO主问题的引用。

链接器抱怨缺少
main
函数

在这里: (.text+0x20):对“main”的未定义引用

你认为主要功能在哪里?在哪个文件中?它通常看起来像这样:

int main(int argc, char* argv[]) {
    ...
}

使用更新的错误消息,看起来标准的C++库没有链接。将“-lstdc++”添加到LDFLAGS

LDFLAGS := -L../lib -Llib/sfml/lib -lsfml-graphics -lsfml-window -lsfml-system -lstdc++

cc-L../lib-Llib/sfml/lib-lsfml graphics-lsfml window-lsfml system-lm-o SnakeGame
中没有对象文件,因此至少缺少main,不能只给出libs

g++Version3Box/Snake/main.cpp Version3Box/Box.cpp Version3Box/Snake/GridPiece.cpp-o SnakeGame-Llib/sfml/lib-lsfml graphics-lsfml window-lsfml系统中


第一个版本中没有对象,因为正如melpomene所说的,源代码找不到,它们也找不到,因为您使用了
make-f Version3Box/Snake/makefile
(cd Version3Box/Snake/;make-f makefile)so
SRC:=$(通配符*.cpp)$(通配符../*.cpp)
在当前目录中查找,而不是像您想象的那样在Version3Box/Snake下查找

我将在解决问题时继续编辑此答案。我将学习gnumake手册()来解决这个问题

编辑:这是成功编译并运行我的程序的工作生成文件

# Specify the final target name
EXE := SnakeGame

# Specify the paths for make to search and find files
vpath %.h Version3Box/SharedHeaders:Version3Box/Snake/Headers
vpath %.cpp Version3Box/SharedCppFiles:Version3Box/Snake/CppFiles

# Specify preprocessor flags (This is a built-in variable)
CPPFLAGS := -I../Include
# Required flags to enable the automatic dependency generation by the compiler
CPPFLAGS += -MMD -MP

# Specify compiler flags (This is a built-in variable)
# Basic Warning Flags
CXXFLAGS := -Wall -W -pedantic

# Specify linker flags (This is a built-in variable)
LDFLAGS := -L../lib -lstdc++ -Llib/sfml/lib -lsfml-graphics -lsfml-window -lsfml-system

#Specify linker libraries (This is a built-in variable)
LDLIBS := -lm

# Specify all of the objects used in compilation and infer recipes
objects = main.o Box.o GridPiece.o

# The compiling rule
SnakeGame : $(objects)
    $(CXX) $(CXXFLAGS) -o $(EXE) $(objects) $(LDFLAGS) $(LDLIBS)

# Dependency of each file
$(objects) : Box.h
main.o GridPiece.o : GridPiece.h

# Remove each intermediate file generated
.PHONY : clean
clean :
    rm $(objects) *.d

大概
$(OBJ)
是空的,因为
$(SRC)
是空的。我如何解决这个问题?@Kalkirin首先创建一个。还有,为什么你在子目录中而不是在项目的顶层有一个makefile?@Kalkirin,正如我在我的答案的编辑版本中所说的,在做make之前进入目录。请更新并重新阅读我的回答,当我读cd版本3box/Snake时;make-f makefile。。。我不再得到main的未定义引用,但我被50-100个新的函数未定义引用错误搞砸了。请发布一个。
CC
是C编译器,
CFLAGS
是C编译器的标志。您的代码是用C++编写的,因此您应该使用<代码> CXX/COD>作为编译器的变量和编译器的标志>代码> CXXFLAGG/<代码>。特别是,你的链接行使用了<代码>(CC)< /C> >,所以它试图链接到C编译器,但是失败了,因为你的代码是C++代码,并且使用C++标准库函数,如果你把程序作为C程序链接,那么这些都是不可用的。这是不是我的SRC定义的问题?问题是:Obj:= $(SRC:.CPP=?o)?可能是因为您使用的是相对路径?我将SRC定义更改为“SRC:=$(通配符Version3Box/Snake/*.cpp)\$(通配符Version3Box/*.cpp)”,并且makefile开始工作3行,但随后我收到了100条不同的未定义引用消息,它失败了。我的主要功能是main.cpp。没有它,程序就无法编译。但是,我认为上面的代码应该找到我的主函数。没有主函数的编译不是问题(例如库没有主函数)。链接在哪里,就在哪里断开。请显示新的错误消息。