簡體   English   中英

如何在 cmake 中使用 SDL2 和 SDL_image

[英]How to use SDL2 and SDL_image with cmake

我正在尋找使用帶有 cmake 的SDL2SDL_image編譯 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;
}

我認為以下內容會起作用,因為它會在我的 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 匹配。

這里有兩篇關於此的博客文章:

在 CMake 中使用 SDL2

在 CMake 中使用 SDL2_image

基本上你需要一個FindSDL2.cmakeFindSDL2_image.cmake模塊。 它們可以基於已包含在 CMake 中的適用於 SDL 1.2 的那些。 使用這些 Find 模塊也適用於 Windows。

如果您使用的是 Linux 並且只需要 SDL2,您甚至不需要FindSDL2.cmake因為以下已經有效:

cmake_minimum_required(VERSION 3.7)

project(SDL2Test)

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

add_executable(SDL2Test Main.cpp)
target_link_libraries(SDL2Test ${SDL2_LIBRARIES})

我在回答這些問題時遇到了麻煩,我認為 cmake 改變了導入目標的方式。 在@trenki 博客文章之后,我需要將我的 CMakeLists.txt 更改為:

project(SDL2Test)
find_package(SDL2 REQUIRED COMPONENTS SDL2::SDL2)
add_executable(SDL2Test main.cpp)
target_link_libraries(SDL2Test SDL2::SDL2)

目前,這在 Arch Linux 上開箱即用。

我介紹了一種用於鏈接到 SDL2、SDL2_image 的現代且可移植的方法。 這些SDL2 CMake 模塊可讓您構建 SDL2 和 SDL2_image 項目,如下所示:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main SDL2::Image)

你應該只在你的項目中克隆 repo:

git clone https://github.com/aminosbh/sdl2-cmake-modules cmake/sdl2

注意:如果 CMake 沒有找到 SDL2/SDL2_image 庫(在 Windows 中),我們可以指定 CMake 選項SDL2_PATHSDL2_IMAGE_PATH如下:

cmake .. -DSDL2_PATH="/path/to/sdl2" -DSDL2_IMAGE_PATH="/path/to/sdl2-image"

它還支持其他相關庫:SDL2_ttf、SDL2_net、SDL2_mixer 和 SDL2_gfx。 有關更多詳細信息,請閱讀README.md文件。

您可以在此處找到使用這些模塊的示例/示例和項目列表: https : //github.com/aminosbh/sdl-samples-and-projects

以下命令對我來說很好用:

set(SDL_INCLUDE_DIR "/usr/include/SDL2")
set(SDL_LIBRARY "SDL2")
include(FindSDL)  

if(SDL_FOUND)  
  message(STATUS "SDL FOUND")
endif()

從 2.6 版本開始,SDL2_image 安裝隨 CMake 配置腳本SDL2_imageConfig.cmake / SDL2_image-config.cmake一起提供。

因此find_package(SDL2_image)無需任何額外FindSDL2_image.cmake模塊即可工作,並創建 IMPORTED 目標SDL2_image::SDL2_image

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

請注意,在這種情況下未設置像SDL2_IMAGE_LIBRARIESSDL2_IMAGE_INCLUDE_DIRS這樣的變量,因此使用它們是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM