编译多个cpp文件错误未定义引用`main'

时间:2015-10-10 11:11:36

标签: 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
                $(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;
}

//编辑。

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

2 个答案:

答案 0 :(得分:2)

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

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
makefile 中的变量区分大小写,这意味着即使您想要包含CFLAGS的内容,也可以获得名为CFlAGS的未声明变量的内容

  

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

  

注意:修复$(CFlAGS)问题后,您可以从相关行中删除-lSDL2

答案 1 :(得分:1)

在您的错误消息中显示:

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