SDL 2未定义参考“WinMain @ 16”和几个SDL功能

时间:2013-06-11 15:31:28

标签: c++ sdl

我刚刚安装了SDL 2,我遇到了一些严重的问题。 这是我的代码:

#include <SDL2\SDL.h>

int main(int argc, char* argv[]){
SDL_Init( SDL_INIT_VIDEO );
SDL_Quit();
return 0;
}

我无法编译,因为我收到了标题中描述的错误:

obj\Debug\main.o||In function SDL_main':|  
C:\Users\myuser\Desktop\test 2000\main.cpp|5|undefined reference to SDL_Init'|
C:\Users\myuser\Desktop\test 2000\main.cpp|7|undefined reference to SDL_Quit'|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to WinMain@16'|  
||=== Build finished: 3 errors, 0 warnings ===|

8 个答案:

答案 0 :(得分:5)

发布编译器命令。 例如:g ++ / gcc ....

你可能没有链接库。

http://content.gpwiki.org/index.php/SDL:Tutorials:Setup 你应该有一个lib的路径,包含在ide中。 (我发现你正在使用代码块)

添加到链接器设置: -lmingw32 -lSDLmain -lSDL

http://www.sdltutorials.com/sdl-tutorial-basics

答案 1 :(得分:4)

我想你想要

#define SDL_MAIN_HANDLED

在你的主文件中,在行

之前
#include <SDL2/SDL.h>

来自:https://stackoverflow.com/a/32343111/5214543

答案 2 :(得分:3)

虽然接受的答案有效(如果你完全遵循它,或阅读评论), 有一点需要注意:您必须遵循链接库的顺序

g++ 01_hello_SDL.cpp -I{add correct path here}/include/SDL2 -L{add correct path here}/lib -lmingw32 -lSDL2main -lSDL2

如果您不希望控制台与窗口一起运行,请将-mwindows添加到选项

答案 3 :(得分:2)

我一直在努力奋斗。

只需将sdl文件从程序文件中移出到桌面或文档等,然后从那里将它们链接到C.

认为它与Windows有关,不允许C访问它们。

希望这会有所帮助 凉爽

答案 4 :(得分:1)

我通过交换

解决了这个问题
int main(int argc, char* argv[])

对齐
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow )

不知道为什么说实话,然后我再次转向SFML。

答案 5 :(得分:1)

您需要使用相同的顺序将这些添加到链接器库:

mingw32
SDL2main
SDL2

请注意,订单很重要。

答案 6 :(得分:1)

如果您使用的是 cLion IDE 中默认的 CMakeLists.txt,您应该在末尾添加这一行:

target_link_libraries(space_fighters mingw32 SDL2main SDL2)

我遇到了同样的问题,我的情况是因为我错过了“mingw32”

答案 7 :(得分:-2)

尝试在Windows 10上的Eclipse CDT 1909中构建和运行一个项目时,我遇到了一个类似的问题,这是我最初在MacOS上的Eclipse中创建的。

我发现使用minGW64编译器可以执行以下步骤。

RMB单击项目,然后选择属性。 在“项目属性”>“ C / C ++生成”中,通过LMB创建一个新的C / C ++ Build配置,单击“管理配置”,然后单击“新建”,将其命名为Debug_Windows,将“复制设置”设置为默认配置,使其处于活动状态,LMB单击“确定”,将配置设置为Debug_Windows。

将项目属性> C / C ++构建>构建器设置>构建命令>当前构建器设置为CDT内部构建器

将项目属性> C / C ++构建>构建器设置>工具链编辑器>当前工具链设置为MinGW GCC

将项目属性> C / C ++构建>构建器设置>工具链编辑器>当前构建器设置为CDT Internal Builder

将以下路径添加到“项目属性”>“ C / C ++构建”>“设置”>“ GCC C ++编译器”>“包含”     “ C:\ Applications \ Library \ SDL2-2.0.9 \ x86_64-w64-mingw32 \ include \ SDL2”

将以下路径添加到“项目属性”>“ C / C ++构建”>“设置”>“ GCC C ++链接器”>“库” “ C:\ Applications \ Library \ SDL2-2.0.9 \ x86_64-w64-mingw32 \ lib”

将以下库按顺序添加到“项目属性”>“ C / C ++构建”>“设置”>“ GCC C ++链接器”>“库”     SLD2主要     SDL

导航到“项目属性”>“运行/调试设置”,LMB单击“新建”,选择“ C / C ++应用程序”,LMB单击“确定”,在“ C / C ++应用程序”字段中输入     Debug_Windows \ project_name.exe(将project_name替换为正确的值)。

将构建配置更改为Debug_Windows。

关闭项目属性。

添加预处理器指令     #定义SDL_MAIN_HANDLED 在包含主要功能的文件顶部。     没有预处理器指令,程序将无法正确链接。

运行程序RMB单击项目,然后选择“运行方式”>“运行配置”,然后选择为构建创建的运行配置。

将SDL2.dll复制到项目目录结构的顶层,就像将其复制到Debug或Debug_Windows目录一样,每次构建项目时都会将其删除。

我发现的要点是,不必在链接器库中包含mingw32,并且#define SDL_MAIN_HANDLED必须位于包含main的文件中,并位于#include之前。