CODE $\Sigma$

2023/01/21
CMakeでSDL2を使う

WindowsでC++のコーディングをする際、多くの方はVisual Studioを使うと思ので、SDL2をWindowsで使う際のサンプルなどは、Visual Studioの使用を前提としたものが多いです。
よって、CMakeでSDL2を動かすサンプルなどがあまり多くなかったため、これを導入する方法を模索しました。

結果としては、そこまで大きな変更をすることなく、自分のCMakeプロジェクトに組み込めることがわかりました。

SDL2のインストール

このサイトからSDL2をダウンロードしてきます。
SDL2-devel-2.26.2-mingw.zipは、MinGWでBuild済みのものです。試していないですが、cmakeディレクトリ内のsdl2-config.cmakeの場所を自身のCMakeプロジェクトに設定すればそのまま使うことができるはずです。

ここでは、source codeをBuildすることでInstallします。

MinGWを用いたSDL2のBuild

source codeをダウンロードしたら、その場所をコマンドプロンプトで開きます。
以下のコマンドを順次実行していきます。

cd /path/to/sdl2-source-code-directory
mkdir build
mkdir install
cd build
cmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/path/to/install/directory
cmake --build .
cmake --install .

インストール先はCMAKE_INSTALL_PREFIX変数で指定できます。今回は作成したinstallディレクトリに指定したので、そこに必要なファイル群がインストールされます。

なお、MinGWはBuildが遅いので、私はNinjaを使いました。こちらでも問題なく動かすことができます。

正しくビルド&インストールできたら、installディレクトリ内にlibディレクトリができ、
lib -> cmake -> SDL2
と移動していくと、SDL2Config.cmakeが生成されていると思います。

自分のCMakeプロジェクトでSDL2を使う

実際にCMakeプロジェクトに組み込んでいきます。
SDL2では、config.cmakeが生成されるので、場所を指定すれば、find_packageで簡単にインストールできます。

おそらくデフォルトでは、
C:\Program Files\CMake\share
がfind_packageの参照先だと思いますが、開発者の環境によって異なる可能性があるので、場所をCMakeLists.txtに直接書きます。

CMakeLists.txtの作成

set (SDL2_DIR "${PROJECT_SOURCE_DIR}/dependencies/SDL2/lib/cmake/SDL2")
find_package(SDL2 CONFIG REQUIRED)

プロジェクトから見た相対位置でSDL2を設定しました。ここでは、dependenciesフォルダ内にインストールしたSDL2のフォルダをコピーし、SDL2Config.cmakeの位置をSDL2_DIRに設定しています。
上のプログラムが動けば、include, linkなど簡単に行えます。

add_executable(Game main.cpp)
target_include_directories(Game PUBLIC
    ${SDL2_INCLUDE_DIRS} 
)
target_link_libraries(Game
    ${SDL2_LIBRARIES} 
    OpenGL32
)

SDL2にはランタイムライブラリがあるので、こちらをBuildして生成された.exeファイルと同じフォルダにコピーする必要があります。
これはcmake –installコマンドで行えるようにします。

set (RUN_TIME_LIBS
    ${PROJECT_SOURCE_DIR}/dependencies/SDL2/bin/SDL2.dll
)
install(FILES ${RUN_TIME_LIBS} DESTINATION ${CMAKE_BINARY_DIR})

CMAKE_BINARY_DIRには、cmakeでout of source buildするときに作成するbuildディレクトリの場所が格納されています。

プログラムのBuild

これで作成したCMakeLists.txtは下記のコマンドでBuildできます。

cd /path/to/project-directory
mkdir build
cd build
cmake -S .. -B . -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug
cmake --build .
cmake --install .

すると、buildフォルダに実行ファイルが生成されています。