cmake 通过 FetchContent 使用 SDL2 和 SDL2_Image

问题描述 投票:0回答:1

我有一个小的 cmake 项目,它通过 FetchContent 使用 SDL,这只适用于 SDL。

cmake_minimum_required(VERSION 3.24)
project(sdl_test)

set(CMAKE_CXX_STANDARD 20)

include(FetchContent)
Set(FETCHCONTENT_QUIET FALSE)

FetchContent_Declare(
        SDL2
        GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
        GIT_TAG release-2.26.3
        GIT_SHALLOW TRUE
        GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(SDL2)
include_directories(${SDL2_SOURCE_DIR}/include})

add_executable(sdl_test main.cpp)
target_link_libraries(sdl_test SDL2::SDL2main SDL2::SDL2-static)

我尝试使用相同的方法来包含 SDL_Image,但是我无法让它工作。

cmake_minimum_required(VERSION 3.24)
project(sdl_test)

set(CMAKE_CXX_STANDARD 20)

include(FetchContent)
Set(FETCHCONTENT_QUIET FALSE)

FetchContent_Declare(
        SDL2
        GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
        GIT_TAG release-2.26.3
        GIT_SHALLOW TRUE
        GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(SDL2)
include_directories(${SDL2_SOURCE_DIR}/include})

FetchContent_Declare(
        SDL2_image
        GIT_REPOSITORY https://github.com/libsdl-org/SDL_image.git
        GIT_TAG release-2.6.3
        GIT_SHALLOW TRUE
        GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(SDL2_image)
include_directories(${SDL2IMAGE_INCLUDE_DIRS}/include})

add_executable(sdl_test main.cpp)
target_link_libraries(sdl_test SDL2::SDL2main SDL2::SDL2-static SDL2_image::SDL2_image-static)

产生以下错误:

CMake Error: install(EXPORT "SDL2ImageExports" ...) includes target "SDL2_image" which requires target "SDL2" that is not in any export set.
CMake Error at CMakeLists.txt:30 (target_link_libraries):
  Target "sdl_test" links to:

    SDL2_image::SDL2_image-static

  but the target was not found.  Possible reasons include:

    * There is a typo in the target name.
    * A find_package call is missing for an IMPORTED target.
    * An ALIAS target is missing.

注意:也许有些人不喜欢使用 FetchContent,但我喜欢它,并且过去一直在使用它用于许多其他依赖项,所以我正在尝试使这种方法起作用。

c++ c cmake sdl sdl-2
1个回答
0
投票

我在这里概述的答案只是一个可能的解决方案,它可能行不通。但值得一试。完成这项工作的最佳方法是不使用

SHALLOW
获取,但我在这里假设你不想要那个


可能的解决方案:

评论中的大多数人都关注错误消息中“错误”的部分。你应该关注的是前两行,即:

CMake Error: install(EXPORT "SDL2ImageExports" ...) includes target "SDL2_image" which requires target "SDL2" that is not in any export set.
CMake Error at CMakeLists.txt:30 (target_link_libraries):

因为找不到目标,你链接的实际库不存在。因此,为什么

BUILD_SHARED_LIBS
选项什么都不做。

它说

SDL2_image
需要目标
SDL2
,它在之前的
FetchContent
调用中定义,但在构建时另一个目标不可用。现在真正的问题是,如何让它可用。

我相信唯一的方法几乎是一种“hacky”的方法。让我们看看

SDL_Image
s
CMakeLists.txt
长什么样,特别是这里的行: 748 号线.

好像

SDL2
作为一个包被称为
SDL2main
,请注意,在
versions 3.0.0+
中它只是
SDL3
.

所以完成这项工作的最佳机会可能是改变第一个

FetchContent_Declare
(注意你需要
CMake 3.24+
):

FetchContent_Declare(
        SDL2main # <--- new name of our target
        GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
        GIT_TAG release-2.26.3
        GIT_SHALLOW TRUE
        GIT_PROGRESS TRUE
        OVERRIDE_FIND_PACKAGE #<--- and we also need to add this
)

这应该有望覆盖后续的

find_package(SDL2main)
调用并可能解决您的问题。


最后一个选项: 如果以上方法不起作用,您可以“不构建”

SDL2_Image
样本,即通过强制
SDL2IMAGE_SAMPLES
False
.

© www.soinside.com 2019 - 2024. All rights reserved.