VS Code配置C+++SDL编译报错:Undefined reference to SDL_main()
解决SDL2链接错误:undefined reference to `SDL_main'
错误原因
在Windows平台下用MinGW编译SDL2程序时,SDL2main库会提供自定义的入口main函数,它会调用代码中的SDL_main作为程序实际入口。你的代码使用了标准main函数,导致链接器找不到SDL_main符号,从而触发报错。
两种解决方案
方案1:适配SDL的入口函数(推荐)
直接将代码中的main函数替换为SDL_main,让SDL的入口逻辑能正确识别程序入口:
修改后的main.cpp:
#include <iostream> #include <SDL2/SDL.h> const int WIDTH = 800 , HEIGHT = 600; int SDL_main( int argc, char *argv[] ) { SDL_Init( SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("Hello Red" , SDL_WINDOWPOS_UNDEFINED , SDL_WINDOWPOS_UNDEFINED , WIDTH , HEIGHT , SDL_WINDOW_ALLOW_HIGHDPI); if (NULL == window) { std::cout << "Error creating window" << SDL_GetError( ) << std::endl; return 1; } SDL_Event windowEvent; while(true) { if(SDL_PollEvent(&windowEvent)) { if(SDL_QUIT == windowEvent.type) { break; } } } SDL_DestroyWindow( window ); SDL_Quit( ); return EXIT_SUCCESS; }
方案2:保留标准main函数
如果希望继续使用标准main作为入口,需告诉SDL不要接管入口逻辑,步骤如下:
- 在包含SDL头文件前定义
SDL_MAIN_HANDLED宏 - 在调用
SDL_Init前添加SDL_SetMainReady()函数调用
修改后的main.cpp:
#include <iostream> #define SDL_MAIN_HANDLED #include <SDL2/SDL.h> const int WIDTH = 800 , HEIGHT = 600; int main( int argc, char *argv[] ) { SDL_SetMainReady(); SDL_Init( SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("Hello Red" , SDL_WINDOWPOS_UNDEFINED , SDL_WINDOWPOS_UNDEFINED , WIDTH , HEIGHT , SDL_WINDOW_ALLOW_HIGHDPI); if (NULL == window) { std::cout << "Error creating window" << SDL_GetError( ) << std::endl; return 1; } SDL_Event windowEvent; while(true) { if(SDL_PollEvent(&windowEvent)) { if(SDL_QUIT == windowEvent.type) { break; } } } SDL_DestroyWindow( window ); SDL_Quit( ); return EXIT_SUCCESS; }
额外说明
你的Makefile中链接库的顺序-l mingw32 -l SDL2main -l SDL2是正确的,无需修改。完成代码修改后重新执行make命令即可正常编译链接。
内容的提问来源于stack exchange,提问作者Red_0nE
相关产品推荐
相关产品推荐

