编译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
相关产品推荐
相关产品推荐

