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中配置项目:
- 右键项目 → Properties → C/C++ Build → Settings → Tool Settings
- 在Cross ARM C Compiler → Includes中,添加Yocto SDK内SDL2头文件路径(通常在
${SDK_PATH}/sysroots/${TARGET_ARCH}-poky-linux-gnueabi/usr/include/SDL2) - 在Cross ARM C Linker → Libraries中,添加
sdl2到库列表;同时在**Library search path (-L)**中添加SDL2库文件路径(通常在${SDK_PATH}/sysroots/${TARGET_ARCH}-poky-linux-gnueabi/usr/lib)
方法2:交叉编译SDL2并手动链接
如果必须手动编译SDL2:
- 使用Yocto SDK的交叉编译工具链编译SDL2,确保生成ARM架构的库文件。
- 在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
相关产品推荐
相关产品推荐

