我有一个小的 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,但我喜欢它,并且过去一直在使用它用于许多其他依赖项,所以我正在尝试使这种方法起作用。
我在这里概述的答案只是一个可能的解决方案,它可能行不通。但值得一试。完成这项工作的最佳方法是不使用
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
.