Code::Blocksを使用してのWindows環境C++言語SDLライブラリ使用方法
Windows上でのCode::Blocks上でSDL(Simple DirectMedia Layer)ライブラリを使用する方法です。
Code::Blocksを使用してのWindows環境C++言語CLIアプリ開発方法チュートリアルの通りに環境構築してある前提での説明をします。
SDL(Simple DirectMedia Layer)ライブラリのダウンロード
以下のURLからSDLをダウンロードしておきます。
SDL自体のビルドも必要ですが、すでにビルド済みのバイナリが同封された「SDL2-devel-2.30.6-mingw.zip」を使用します。
SDL(Simple DirectMedia Layer)ライブラリのフォルダ構造
「SDL2-devel-2.30.6-mingw.zip」を解凍します。
「SDL2-2.30.6」フォルダ内は以下のようになっています。
D:.
├─cmake
├─docs
├─i686-w64-mingw32
│ ├─bin
│ ├─include
│ │ └─SDL2
│ ├─lib
│ │ ├─cmake
│ │ │ └─SDL2
│ │ └─pkgconfig
│ └─share
│ └─aclocal
├─test
│ ├─emscripten
│ ├─n3ds
│ ├─nacl
│ └─shapes
└─x86_64-w64-mingw32
├─bin
├─include
│ └─SDL2
├─lib
│ ├─cmake
│ │ └─SDL2
│ └─pkgconfig
└─share
└─aclocal
ここで重要なのが「i686-w64-mingw32」フォルダと「x86_64-w64-mingw32」フォルダです。
32bitコンパイラ向けが「i686-w64-mingw32」。
64bitコンパイラ向けが「x86_64-w64-mingw32」。
Code::Blocksを使用してのWindows環境C++言語CLIアプリ開発方法チュートリアルの通りであれば64bit版のコンパイラを使用しているので、「x86_64-w64-mingw32」フォルダ内のファイルを使用することになります。
プロジェクトの作成
Code::Blocksを使用してのWindows環境C++言語CLIアプリ開発方法チュートリアルの通りにコンソールプロジェクトが作成されていれば問題ありません。
今回はDドライブ直下に「sdl_test」というプロジェクトを準備しました。
先ほど解凍したSDLライブラリのフォルダをプロジェクトフォルダ内に移動しておきましょう。
プロジェクトのビルドターゲット設定
上部メニューから「Project」→「Properties...」を開きます。
「Build targets」タブを開き、左の「Build targets」欄から、「Debug」と「Release」をそれぞれ設定する必要があります。
「Selected build target options」欄で「Type」を「Console application」にするか、「GUI application」にするかです。
コンソールアプリケーションのままでビルドを行うと、アプリケーションのウィンドウ以外にコンソール窓も表示されます。
デバッグの際は便利かもしれませんが、公開する場合のリリースビルドに関してはどうでしょう?
私は「GUI application」にしておきました。
プロジェクトのビルドオプション設定
上部メニューから「Project」→「Build options...」を開きます。
こちらも左側のツリーから「Debug」と「Release」それぞれビルドごとに設定があります。
「Search directories」タブにて設定するもの
タブ中の「Compiler」タブにて、「Add」、「SDL2-2.30.6\x86_64-w64-mingw32\include」相対パスを追加。
フォルダ指定する際に「Keep this as a relative path?」と相対パスにするかどうか聞かれるので「はい(Y)」で相対パスにしておきます。
プロジェクトディレクトリからの相対パスにしておけば、プロジェクトフォルダを移動しても読み込まれるでしょう。
(プロジェクトフォルダ内にSDLライブラリが存在する必要はあります)
タブ中の「Linker」タブにて、「Add」、「SDL2-2.30.6\x86_64-w64-mingw32\lib」相対パスを追加。
ここにはビルド済みのSDLライブラリがあります。
なお、32bitのコンパイラを使用している場合には、ビルドに失敗すると思うので適した方を使用してください。
「Linker settings」タブにて設定するもの
「Other linker options」に次のセクションの内容を入力する。
Code::Blocksを使用してのWindows環境C++言語CLIアプリ開発方法チュートリアルの通りに環境構築してあれば、グローバルのコンパイラーセッティング(「Settings」→「Compiler」)にて静的リンク(static)設定にしてあるので注意してください。
これはプロジェクトオプション(「Project」→「Build options...」)側には表示されませんが反映されていますので、こちらで動的リンクにしてある(static指定を外す)からといって、動的リンクでビルドされるとは限りません。
必ず、グローバルのコンパイラセッティングも見ておきましょう。
SDLのリンク設定について
動的と静的でリンクが必要なライブラリが異なります。
動的リンクする場合
-lmingw32 -lSDL2main -lSDL2
静的リンクする場合
上記、動的リンクのオプションに加えて、以下のオプションが必要
-Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid
- https://stackoverflow.com/questions/72163357/sdl-mingw-static-lib-linking-errors
- https://stackoverflow.com/questions/61563619/compiling-sdl2-opengl-glad-project-in-codeblocks-on-windows-undefined-ref
動的リンクの場合は、「SDL2.dll」と「libstdc++-6.dll」「libwinpthread-1.dll」「libgcc_s_seh-1.dll」等が要求されます。
(SDL2.dll以外のDLLはC:\Program Files\CodeBlocksにあります)
dllはexeと同じディレクトリ、もしくはWindowsインストールディレクトリ内のSystemフォルダなどに入れておく必要があります。
バイナリを配布する場合にはDLLも同封しないといけません。
他の環境で動かす場合に手間がかかりますので、私は基本的に1つのexeにまとめるため静的リンクにしてしまっています。
exeファイルのサイズが大きくなってしまいますが、他にDLLを必要としなくなるので便利でしょう。
SDLのコードを動かす
- https://sirius10.net/blog/wordpress/index.php/2021/09/27/2070/
- http://www.lancarse.co.jp/blog/?p=4023
- https://lazyfoo.net/tutorials/SDL/index.php
冒頭に #include <SDL2/SDL.h> と書きます。
それ以降はSDLで記述すれば動作します。
SDLの応用
SDLを使用した上での応用例です。