如何在 cmake 中使用 SDL2 和 SDL_image

新手上路,请多包涵

我正在寻找使用 SDL2SDL_image 和 cmake 编译 c++ 程序的最简单方法。

经过数小时的搜索,这是我最好的尝试:

CMakeLists.txt

 project(shooter-cmake2)

cmake_minimum_required(VERSION 2.8)

set(SOURCES
shooter.cpp
classes.cpp
utils.cpp
)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

add_executable(${PROJECT_NAME} ${SOURCES})

INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2_image REQUIRED sdl2_image)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARY})

我收到这些错误:

 In function `loadTexture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, SDL_Renderer*)':
undefined reference to `IMG_LoadTexture'
collect2: ld returned 1 exit status

这是函数调用:

 #include "SDL.h"
#include "SDL_image.h"

SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){
    SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
    texture != nullptr or die("LoadTexture");
    return texture;
}

生无可恋。请帮我!谢谢! :)

原文由 Carl Lemaire 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

我认为以下内容会起作用,因为它会在我的 ubuntu 系统上找到库,并且您提供的示例函数可以链接:

 project(shooter-cmake2)

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

add_executable(${PROJECT_NAME} src/test.cpp)

INCLUDE(FindPkgConfig)

PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)

INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})

如果使用 –debug-output 执行 cmake,它会输出:

 -- Found PkgConfig: /usr/bin/pkg-config (found version "0.26")
Called from: [2]    /usr/share/cmake-2.8/Modules/FindPkgConfig.cmake
            [1] $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt
-- checking for one of the modules 'sdl2'
Called from: [1]    $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt
-- checking for one of the modules 'SDL2_image>=2.0.0'
Called from: [1]    $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt

这让我检查了内容

/usr/lib/x86_64-linux-gnu/pkgconfig/sdl2.pc
/usr/lib/x86_64-linux-gnu/pkgconfig/SDL2_image.pc

我注意到 SDL2_image.pc 包含 Name: SDL2_image 我认为应该将第三个参数与该库的 PKG_SEARCH_MODULE 匹配。

原文由 wojciii 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 2.6 版本开始,SDL2_image 安装附带 CMake 配置脚本 SDL2_imageConfig.cmake / SDL2_image-config.cmake

所以 find_package(SDL2_image) 无需任何额外 FindSDL2_image.cmake 模块即可工作,并创建导入目标 SDL2_image::SDL2_image

 find_package(SDL2_image REQUIRED)
target_link_libraries(<executable-target> SDL2_image::SDL2_image)


请注意,在这种情况下未设置 SDL2_IMAGE_LIBRARIESSDL2_IMAGE_INCLUDE_DIRS 等变量,因此使用它们毫无意义。

原文由 Tsyvarev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题