为什么在使用SDL2时仍然出现“未定义参考”链接器错误?

时间:2018-09-20 16:54:25

标签: c++ sdl sdl-2

我已经查看了堆栈溢出中与该错误直接相关的所有其他页面。

我正在尽力而为,但仍然出现此错误

  

对“ SDL_Init”的未定义引用

这是构建日志:

C:\WINDOWS\system32\cmd.exe /C C:/TDM-GCC-64/bin/mingw32-make.exe -j4 SHELL=cmd.exe -e -f  Makefile
"----------Building project:[ testproject - Debug ]----------"
mingw32-make.exe[1]: Entering directory 'C:/Users/Andre/Documents/CodeLiteWorkspace/testproject'
C:/TDM-GCC-64/bin/g++.exe -o ./Debug/testproject @"testproject.txt" -L.
./Debug/main.cpp.o:main.cpp:(.text+0x43): undefined reference to `SDL_Init'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[1]: *** [Debug/testproject] Error 1
testproject.mk:82: recipe for target 'Debug/testproject' failed
mingw32-make.exe[1]: Leaving directory 'C:/Users/Andre/Documents/CodeLiteWorkspace/testproject'
mingw32-make.exe: *** [All] Error 2
Makefile:4: recipe for target 'All' failed
====2 errors, 0 warnings====

这些是我正在使用的构建选项

-std=c++11;-IC:\SDL2\include -LC:\SDL2\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2

我知道所有内容(编译器和库文件)都是64位二进制文​​件。我发现它给了我同样的错误,但是如果我要使用普通的SDL_Init输入函数,它会显示WinMain而不是int main(),所以现在我使用的是{{1 }},从而消除了该错误。所以现在我的代码仅由

组成
int WinMain()

如果我注释掉extern "C"{ #include <SDL2/SDL.h> } int WinMain(){ SDL_Init( SDL_INIT_EVERYTHING ); return 0; } 函数,则该程序没有构建错误,但是什么也没做。

有人知道这与我使用的编译器稍有不同吗?另外,我不确定,但是从构建日志来看,它似乎实际上并未使用我提供的构建选项(我使用的是IDE,因此程序可以对其进行管理)。最后,如果有人知道为什么要我使用SDL_Init而不是常规的main函数,并告诉我要进行哪些更改以解决此问题,将不胜感激。

makefile:

WinMain

1 个答案:

答案 0 :(得分:1)

您已将链接选项添加到CXXFLAGS(不属于这些链接),但不链接到LibPathLibsLinkOptions。因此,您在编译阶段指定了链接器选项(该操作不执行任何操作,因为不执行链接),但是在链接阶段则没有这些选项。

“逻辑上”正确的设置应为

Libs:=-lmingw32 -lSDL2main -lSDL2
LibPath:=-LC:\SDL2\lib -L.
LinkOptions:=-Wl,-subsystem,windows -mwindows

(不确定SDL2main应该在那里,因为您不清楚是否使用它,因为您拥有WinMain而不是main / SDL_main

此外,您从字面上询问了-w选项的问题,因此不要感到惊讶。如果您不希望出现其他问题,请不要阻止编译器为您提供帮助,甚至更好-至少用-Wall寻求更多帮助。