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

LVGL开发遇SDL函数未定义引用错误,求解决方法

解决LVGL项目链接SDL2库时的未定义引用错误

我正按照LVGL的Linux framebuffer教程,使用Eclipse IDE和Toradex的Yocto SDK开发LVGL项目。之前遇到<SDL2/SDL.h>文件不存在的错误,通过手动下载SDL2并添加头文件引用解决,但随后出现大量链接错误,提示SDL_GetTicks等多个SDL函数未定义引用,具体错误信息如下:

in function `lv_tick_get':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lvgl/src/hal/lv_hal_tick.c:77: undefined reference to `SDL_GetTicks'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lvgl/src/hal/lv_hal_tick.c:77: undefined reference to `SDL_GetTicks'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `window_update':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:372: undefined reference to `SDL_UpdateTexture'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:377: undefined reference to `SDL_RenderClear'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:387: undefined reference to `SDL_RenderCopy'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:388: undefined reference to `SDL_RenderPresent'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:380: undefined reference to `SDL_SetRenderDrawColor'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:383: undefined reference to `SDL_RenderDrawRect'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `sdl_event_handler':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:272: undefined reference to `SDL_PollEvent'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:272: undefined reference to `SDL_PollEvent'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `monitor_sdl_clean_up':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:326: undefined reference to `SDL_DestroyTexture'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:327: undefined reference to `SDL_DestroyRenderer'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:328: undefined reference to `SDL_DestroyWindow'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:337: undefined reference to `SDL_Quit'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `sdl_init':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:122: undefined reference to `SDL_Init'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:124: undefined reference to `SDL_SetEventFilter'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `window_create':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:348: undefined reference to `SDL_CreateWindow'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:352: undefined reference to `SDL_CreateRenderer'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:353: undefined reference to `SDL_CreateTexture'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: /home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:355: undefined reference to `SDL_SetTextureBlendMode'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl.o: in function `sdl_init':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl.c:135: undefined reference to `SDL_StartTextInput'
/opt/poky/3.1.21/sysroots/i686-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/9.5.0/real-ld: ./src/lv_drivers/sdl/sdl_common.o: in function `keycode_to_ctrl_key':
/home/apm/eclipse-workspace/LVGLproj/Debug/../src/lv_drivers/sdl/sdl_common.c:229: undefined reference to `SDL_GetModState'
collect2: error: ld returned 1 exit status
make: *** [makefile:191: LVGLproj] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

20:17:37 Build Failed. 23 errors, 0 warnings. (took 2m:544ms)

问题原因

你只添加了SDL2的头文件路径,让编译器能找到函数声明,但链接阶段没有告诉链接器要链接SDL2的库文件,所以出现函数未定义的错误。另外,手动下载的SDL2可能是x86架构版本,和你使用的ARM交叉编译环境不兼容,这也会导致链接失败。

解决方案

方法1:使用Yocto SDK自带的SDL2库(推荐)

  • 确认Yocto SDK是否包含SDL2开发包,若没有则重新构建SDK并添加SDL2-dev包到配置中。
  • 在Eclipse中配置项目:
    1. 右键项目 → Properties → C/C++ Build → Settings → Tool Settings
    2. 在Cross ARM C Compiler → Includes中,添加Yocto SDK内SDL2头文件路径(通常在${SDK_PATH}/sysroots/${TARGET_ARCH}-poky-linux-gnueabi/usr/include/SDL2)
    3. 在Cross ARM C Linker → Libraries中,添加sdl2到库列表;同时在**Library search path (-L)**中添加SDL2库文件路径(通常在${SDK_PATH}/sysroots/${TARGET_ARCH}-poky-linux-gnueabi/usr/lib)

方法2:交叉编译SDL2并手动链接

如果必须手动编译SDL2:

  1. 使用Yocto SDK的交叉编译工具链编译SDL2,确保生成ARM架构的库文件。
  2. 在Eclipse链接器设置中,添加编译好的SDL2库路径和libSDL2.so库文件。

方法3:修改Makefile(若项目用Makefile构建)

在Makefile中添加SDL2的链接参数:

# 添加SDL2头文件路径
CFLAGS += -I/path/to/SDL2/include
# 添加SDL2库路径和链接参数
LDFLAGS += -L/path/to/SDL2/lib -lSDL2

注意替换为实际的ARM架构SDL2头文件和库文件路径。

额外提示

不要混用x86架构库和ARM交叉编译环境,优先使用Yocto SDK自带库,保证兼容性和稳定性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:50:28