You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不要接管入口逻辑,步骤如下:

  1. 在包含SDL头文件前定义SDL_MAIN_HANDLED宏
  2. 在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:17:03