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

链接SDL2_LIBRARIES后仍出现SDL_Init未定义引用问题求助

SDL2 CMake项目编译未定义引用错误解决办法

问题背景

在Ubuntu系统下使用VSCode开发基于SDL2的CMake项目,已通过apt-get安装CMake、Ninja、G++及libsdl2-dev包,但编译时出现SDL_Init、SDL_CreateWindow等SDL函数的未定义引用错误。

错误信息

usr/bin/g++ -fdiagnostics-color=always -g /home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp -o /home/myUsername/Documents/Coding/CPP/Pong/src/main
/usr/bin/ld: /tmp/ccbnY9S2.o: in function `main':
/home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp:6: undefined reference to `SDL_Init'
/usr/bin/ld: /home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp:12: undefined reference to `SDL_CreateWindow'
/usr/bin/ld: /home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp:24: undefined reference to `SDL_GetWindowSurface'
/usr/bin/ld: /home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp:32: undefined reference to `SDL_UpdateWindowSurface'
/usr/bin/ld: /home/myUsername/Documents/Coding/CPP/Pong/src/main.cpp:34: undefined reference to `SDL_Delay'
collect2: error: ld returned 1 exit status

项目结构

  • 根目录:Pong
    • CMakeLists.txt
    • src/
      • main.cpp

代码文件

main.cpp

#include <SDL2/SDL.h>
#include <iostream>

int main()
{
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cout << "Failed to initialize the SDL2 library\n";
        return -1;
    }

    SDL_Window *window = SDL_CreateWindow("SDL2 Window",
                                          SDL_WINDOWPOS_CENTERED,
                                          SDL_WINDOWPOS_CENTERED,
                                          680, 480,
                                          0);

    if(!window)
    {
        std::cout << "Failed to create window\n";
        return -1;
    }

    SDL_Surface *window_surface = SDL_GetWindowSurface(window);

    if(!window_surface)
    {
        std::cout << "Failed to get the surface from the window\n";
        return -1;
    }

    SDL_UpdateWindowSurface(window);

    SDL_Delay(5000);
}

原CMakeLists.txt

cmake_minimum_required(VERSION 3.7)
project(Pong)


find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})

add_executable(Pong src/main.cpp)
target_link_libraries(Pong ${SDL2_LIBRARIES})

解决方案

1. 遵循CMake标准构建流程

从错误信息看,你直接用g++编译单个源文件,未通过CMake生成的构建脚本链接SDL库。必须执行完整的CMake构建步骤:

# 在项目根目录创建构建目录
mkdir build && cd build
# 生成构建文件
cmake ..
# 编译项目
make
# 运行程序
./Pong

2. 修复CMakeLists.txt配置

部分版本的SDL2 CMake模块变量存在差异,推荐使用更规范的CMake语法:

方案A:目标式链接(推荐)

cmake_minimum_required(VERSION 3.7)
project(Pong)

find_package(SDL2 REQUIRED)

add_executable(Pong src/main.cpp)
# 用target_include_directories替代全局include_directories,作用域更清晰
target_include_directories(Pong PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(Pong PRIVATE ${SDL2_LIBRARIES})

方案B:使用pkg-config模块(兼容性更强)

如果CMake的FindSDL2模块工作异常,改用pkg-config获取SDL2的编译链接参数:

cmake_minimum_required(VERSION 3.7)
project(Pong)

find_package(PkgConfig REQUIRED)
pkg_search_module(SDL2 REQUIRED sdl2)

add_executable(Pong src/main.cpp)
target_include_directories(Pong PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(Pong PRIVATE ${SDL2_LIBRARIES})

方案C:直接使用SDL2导入目标

部分SDL2包提供了SDL2::SDL2导入目标,可简化配置:

cmake_minimum_required(VERSION 3.7)
project(Pong)

find_package(SDL2 REQUIRED COMPONENTS SDL2)

add_executable(Pong src/main.cpp)
target_link_libraries(Pong PRIVATE SDL2::SDL2)

3. 验证SDL2安装正确性

执行以下命令检查SDL2的编译链接参数:

pkg-config --cflags --libs sdl2

正常输出应为:

-I/usr/include/SDL2 -lSDL2

如果无输出或报错,说明libsdl2-dev未正确安装,重新执行:

sudo apt-get purge libsdl2-dev && sudo apt-get install libsdl2-dev

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:25:30