我已经查看了堆栈溢出中与该错误直接相关的所有其他页面。
我正在尽力而为,但仍然出现此错误
对“ 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
答案 0 :(得分:1)
您已将链接选项添加到CXXFLAGS
(不属于这些链接),但不链接到LibPath
,Libs
或LinkOptions
。因此,您在编译阶段指定了链接器选项(该操作不执行任何操作,因为不执行链接),但是在链接阶段则没有这些选项。
“逻辑上”正确的设置应为
Libs:=-lmingw32 -lSDL2main -lSDL2
LibPath:=-LC:\SDL2\lib -L.
LinkOptions:=-Wl,-subsystem,windows -mwindows
(不确定SDL2main应该在那里,因为您不清楚是否使用它,因为您拥有WinMain
而不是main
/ SDL_main
)
此外,您从字面上询问了-w
选项的问题,因此不要感到惊讶。如果您不希望出现其他问题,请不要阻止编译器为您提供帮助,甚至更好-至少用-Wall
寻求更多帮助。