我目前正在学习如何使用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函数未定义
答案 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
。