编译多个 cpp 文件 对"主"的未定义引用错误

Compiling a multiple cpp files Error undefined reference to `main'

本文关键字:引用 错误 未定义 cpp 文件 编译      更新时间:2023-10-16

我目前正在学习如何使用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

每次编译时。我总是得到这个错误。但是我已经宣布了我的主菜单。它是在寻找一个主在我的图形。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

下面是我的main函数

#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函数undefined

你的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

makefiles中的变量是区分大小写的,这意味着即使您想包含CFLAGS的内容,您也会得到一个名为CFlAGS的未声明变量的内容。


注意:如果没有-c,你告诉g++运行链接器,因此它将寻找一个名为main的函数,以便它可以生成一个可执行文件;graphics.cpp不包含此功能,并且发出您所提供的诊断。

注意:在您修复了$(CFlAGS)的问题后,您将能够从相关行中删除-lSDL2

在你的错误信息中说:

make: *** [Graphics.o] Error 1

这意味着这个错误发生在编译Graphics.o时,而不是链接game时。

编译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的变量名。