【发布时间】:2021-01-30 13:13:23
【问题描述】:
我打算用 C++ 编写一个小型 2D 游戏引擎,使用 SDL2 进行渲染。我想为 SDL2 编写一个包装库,以使其更易于自己使用。如何使用 CMake 将此库与 SDL2 链接?
【问题讨论】:
-
我相信它与使用 CMake 时的任何库几乎相同。这是一个例子:https://trenki2.github.io/blog/2017/06/02/using-sdl2-with-cmake/
我打算用 C++ 编写一个小型 2D 游戏引擎,使用 SDL2 进行渲染。我想为 SDL2 编写一个包装库,以使其更易于自己使用。如何使用 CMake 将此库与 SDL2 链接?
【问题讨论】:
所以您希望您的应用程序像这样链接到包装库:
Application --> Wrapper lib --> Actual lib
步骤如下:
尝试以最简单的方式在您的系统上找到已安装的库:
find_package(SDL2 REQUIRED)
对于较新的 cmake 版本应该足够了。对于旧版本 - 请参阅有关如何使用 CMake 定位 SDL2 的链接问题。
第一步留下了裸cmake变量SDL2_INCLUDE_DIRS和SDL2_LIBRARIES。虽然可以按原样使用它们,但将它们组合在一个目标中会更方便,并通过 CMakeLists.txt 文件的其余部分使用该目标。为外部库创建 INTERFACE 目标比创建 IMPORTED 目标要容易一些,因此:
add_library (external.sdl2 INTERFACE)
target_include_directories(external.sdl2 INTERFACE ${SDL2_INCLUDE_DIRS})
target_link_libraries (external.sdl2 INTERFACE ${SDL2_LIBRARIES})
现在,每次您将 anything 链接到目标 external.sdl2 时,都会自动拉入包含目录和实际库。
add_library(my_wrapper STATIC
my_wrapper.cpp
)
target_link_libraries(my_wrapper
external.sdl2
)
注意:您不再需要明确的include_directories。
add_executable(my_game
my_game.cpp
)
target_link_libraries(my_game
my_wrapper
)
同样,您不必在目标库中提及 SDL2,而不是包含目录;它们将被隐式添加,因为 my_wrapper 目标使用它。
附:既然这是一个 C++ 项目,为什么不使用 SDL2PP,即 SDL2 上的 C++ 包装器?
【讨论】: