使用cmake创建使用SDL的库



我正在尝试在SDL2的顶部创建一个库。对于编译,我使用cmake。首先,我有这个库的CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(SquareEngine)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
include_directories(${SDL2_IMAGE_INCLUDE_DIRS})
set (SRCS   Main.cpp
Rectangle.cpp
Scene.cpp
SquareEngine.cpp)
set (HEADERS    Rectangle.hpp
Scene.hpp
SquareEngine.hpp
utils/Color.hpp
utils/Vector.hpp)
add_library(SquareEngine ${SRCS} ${HEADERS} ${SDL} ${SDL_SRC})
target_link_libraries(SquareEngine ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})

要包含SDL2和SDL2图像,我遵循以下说明。

当我尝试构建它的工作完美。

现在我尝试在项目中使用我的库。我创建了自己的项目,并链接了我的库,该库位于我的项目中的子文件夹/SquareEngine中。对于这个项目,我使用这个CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(Demo)

set (SRCS Main.cpp)
add_subdirectory(SquareEngine)
add_executable(Demo ${SRCS})
target_link_libraries(Demo PUBLIC SquareEngine)
target_include_directories(Demo PUBLIC SquareEngine)

当我尝试构建项目时,我得到了这样的错误:Cannot open include file: 'SDL.h': No such file or directory

我试了很长时间,但我不知道为什么。

也许使用静态的SDL比使用共享的SDL更好?

我认为你需要添加SDL包含目录到SquareEngine库:

target_include_directories(SquareEngine PUBLIC ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})

最新的SDL2版本提供了SDL2::*CMake目标,这样你就不需要再摆弄CMake变量了。因此,不再需要发布自定义FindSDL2.cmake和/或FindSDL2_image.cmake模块。

有了这些,你可以重写你的cmake脚本为:
cmake_minimum_required(VERSION 3.10)
project(SquareEngine)
find_package(SDL2 REQUIRED CONFIG)
find_package(SDL2_image REQUIRED CONFIG)
set (SRCS
Main.cpp
Rectangle.cpp
Scene.cpp
SquareEngine.cpp
)
set (HEADERS
Rectangle.hpp
Scene.hpp
SquareEngine.hpp
utils/Color.hpp
utils/Vector.hpp
)
add_library(SquareEngine ${SRCS} ${HEADERS})
target_link_libraries(SquareEngine PRIVATE SDL2::SDL2 SDL2_image::SDL2_image)
target_include_directories(SquareEngine
PUBLIC
$<TARGET_PROPERTY:SDL2::SDL2,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:SDL2_image::SDL2_image,INTERFACE_INCLUDE_DIRECTORIES>
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
)

它可以在你的游戏中使用:

cmake_minimum_required(VERSION 3.10)
project(Demo)
set (SRCS Main.cpp)
add_subdirectory(SquareEngine)
add_executable(Demo ${SRCS})
target_link_libraries(Demo PUBLIC SquareEngine)

最新更新