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

编译SDL2代码出现未定义引用错误,已定位gcc版本问题

SDL2编译未定义引用问题排查与解决

编译错误信息

C:\Users\alvel\AppData\Local\Temp\ccgEmjJ0.o:main.c:(.text+0xe): undefined reference to `SDL_Init'
C:\Users\alvel\AppData\Local\Temp\ccgEmjJ0.o:main.c:(.text+0x44): undefined reference to `SDL_CreateWindow'
C:\Users\alvel\AppData\Local\Temp\ccgEmjJ0.o:main.c:(.text+0x52): undefined reference to `SDL_DestroyWindow'
C:\Users\alvel\AppData\Local\Temp\ccgEmjJ0.o:main.c:(.text+0x57): undefined reference to `SDL_Quit'
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'

测试代码

#include <stdio.h>
#include <stdlib.h>

#include <SDL2/SDL.h>

static const int width = 320;
static const int height = 180;

int main(int argc, char **argv){
    
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *window = SDL_CreateWindow("Hello, SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);

    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

使用的Makefile

OBJS = main.c

CC = gcc

COMPILER_FLAGS = -Wall -Iinclude

LINKER_FLAGS = -Llib -lSDL2

OBJ_NAME = main.exe

all : $(OBJS)
    $(CC) $(OBJS) $(COMPILER_FLAGS) -o build\$(OBJ_NAME) $(LINKER_FLAGS)

问题定位与解决

已确认问题根源是使用的GCC版本过旧(当前为MinGW 32位的6.3.0版本),旧版本GCC与SDL2库的链接逻辑存在兼容性问题,导致无法正确解析SDL2的函数符号,同时触发WinMain@16未定义的错误(SDL2在旧GCC环境下可能默认以Windows GUI程序模式编译,找不到入口)。

解决方法:

  • 升级MinGW GCC到8.0及以上版本,推荐使用适配SDL2的最新MinGW-w64发行版(32位或64位均可,需与SDL2库的位数匹配)
  • 升级后保持原Makefile的链接配置即可正常编译

内容的提问来源于stack exchange,提问作者Alve Lycken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:22:17