C++ 编译多个cpp文件错误未定义对“main';

C++ 编译多个cpp文件错误未定义对“main';,c++,makefile,C++,Makefile,我目前正在学习如何使用makefile,并将main.cpp划分为多个文件 这是我目前的结构 ├── makefile └── src ├── Graphics │   ├── Graphics.cpp │   └── Graphics.h └── main.cpp 还有我的makefile CC = g++ CFLAGS = -c LFLAGS = -Wall OUTPUT = game game : main.o Graphics.o

我目前正在学习如何使用makefile,并将main.cpp划分为多个文件

这是我目前的结构

├── makefile
└── src
    ├── Graphics
    │   ├── Graphics.cpp
    │   └── Graphics.h
    └── main.cpp
还有我的makefile

CC = g++
CFLAGS = -c
LFLAGS = -Wall
OUTPUT = game

game : main.o Graphics.o
                $(CC) $(LFLAGS) main.o Graphics.o -lSDL2 -lSDL2_image -o $(OUTPUT)
main.o : src/main.cpp
                $(CC) $(CFLAGS) src/main.cpp
Graphics.o : src/Graphics/Graphics.cpp
                $(CC) $(CFlAGS) src/Graphics/Graphics.cpp -lSDL2
每次我编译。我总是犯这个错误。但我有我的主要任务。它是在我的Graphics.cpp中寻找主节点吗

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [Graphics.o] Error 1
这是我的主要功能

#include "Graphics/Graphics.h"

int main(int argc , const char * argv[]){
  Graphics graphics;
  while(true){
    //do things here later
  }
  return 0;
}
//编辑


顺便说一句,如果删除-lSDL2,是否还有一种方法不链接Graphics.cpp上的sdl2。它会给我所有未定义的sdl2函数

你的makefile中有一个输入错误
$(CFlAGS)
$(CFlAGS)
不同,这意味着在尝试编译
src/Graphics/Graphics.cpp
时,
-c
不会作为命令行选项传递给编译器

CC = g++
CFLAGS = -c
LFLAGS = -Wall
OUTPUT = game

game : main.o Graphics.o
                $(CC) $(LFLAGS) main.o Graphics.o -lSDL2 -lSDL2_image -o $(OUTPUT)
main.o : src/main.cpp
                $(CC) $(CFLAGS) src/main.cpp
Graphics.o : src/Graphics/Graphics.cpp
                $(CC) $(CFlAGS) src/Graphics/Graphics.cpp -lSDL2
CC=g++
CFLAGS=-c
LFLAGS=-Wall
输出=游戏
游戏:main.o Graphics.o
$(CC)$(LFLAGS)main.o Graphics.o-lSDL2-lSDL2_image-o$(输出)
main.o:src/main.cpp
$(CC)$(CFLAGS)src/main.cpp
Graphics.o:src/Graphics/Graphics.cpp
$(CC)$(CFlAGS)src/Graphics/Graphics.cpp-lSDL2
makefiles中的变量是区分大小写的,这意味着即使您希望包含
CFLAGS
的内容,也会得到名为
CFLAGS
的未声明变量的内容


注意:如果没有
-c
,您将告诉
g++
运行链接器,因此它将查找名为
main
的函数,以便生成可执行文件<代码>图形。cpp不包含此功能,将发出您显示的诊断

注意:使用
$(CFlAGS)
解决问题后,您将能够从相关行中删除
-lSDL2


在您的错误消息中,会显示:

make: *** [Graphics.o] Error 1
这意味着此错误发生在编译
Graphics.o
时,而不是链接
游戏时

编译
Graphics.o
的命令是

   $(CC) $(CFlAGS) src/Graphics/Graphics.cpp -lSDL2
-lSDL2
在这里没有意义:您想要编译一个对象文件,因此不涉及链接器。但是你得到链接器错误-为什么

因为要在没有链接的情况下编译,您需要
-c
选项。这是
CFLAGS
变量的一部分。但是您没有使用
CFLAGS
,而是使用
CFLAGS
(小写
l
)。所以我打赌make正在运行的命令

g++  src/Graphics/Graphics.cpp -lSDL2
没有
-c


修复:删除
-lSDL2
,在变量名中大写
L

您的主函数看起来如何?请在你的问题中添加一个简化的代码。我已经更新了我的问题。它可能与SDL有关。他们没有定义自己的入口点吗?产生错误的命令是什么?我也是这么想的。但是第一个版本single main.cpp有效。废话。谢谢在编译CGICIC.CPP ALSOTW时不需要-LSDL2,因为C++在代码< > MaFigue< /C>中使用<代码> CXX/COD>和<代码> CXXFLAGG/<代码>。