【问题标题】:Compiling a multiple cpp files Error undefined reference to `main'编译多个 cpp 文件错误 undefined reference to `main'
【发布时间】:2015-10-10 11:11:36
【问题描述】:

我目前正在学习如何使用 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 中寻找一个 main 吗?

/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 函数

【问题讨论】:

  • 你的主要功能是什么样子的?请在您的问题中添加简化代码。
  • 我已经更新了我的问题
  • 可能与SDL有关。他们不定义自己的入口点吗?
  • 产生错误的命令是什么?
  • 我也是这么想的。但第一个版本的单个 main.cpp 有效。

标签: c++ makefile


【解决方案1】:

您的 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 中的变量区分大小写,这意味着即使您想要包含 CF<b>L</b>AGS 的内容,您也会得到一个名为 CF<b>l</b>AGS 的未声明变量的内容。


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

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

【讨论】:

  • 哦。废话。谢谢。在编译 Graphics.cpp 时也不需要 -lSDL2
  • 顺便说一句,对于 C++,在您的 Makefile 中使用 CXXCXXFLAGS
【解决方案2】:

在您的错误消息中它说:

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大写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多