はじめに
初めて記事を書きます。ヨウキンです。
最近、C++を勉強し始めました。最初はDirectXで勉強しようと思っていたのですが、DirectXはWindows向けのAPIなので、Macでは基本的に使えないことを知りました。
そこで調べてみたところ、マルチプラットフォームに対応したSDLというライブラリを知りました。SDLの環境構築について調べてみたのですが、SDL3についての日本語記事があまり多くなかったため、Qiitaに記事を投稿してみようと思います。
環境
- macOS
- C++
- SDL3
- CMake
- VSCode
今回作る構成
最終的には、以下のような構成にします。
HelloWorld/
main.cpp
CMakeLists.txt
vendored/
SDL/
SDL本体
build/
vendored/SDL の中にSDL本体を入れます。
自分が書くC++コードは、vendored/SDL の中ではなく、HelloWorld 直下に置きます。
HelloWorld/
main.cpp
CMakeLists.txt
vendored/
SDL
必要なものを準備する
Command Line Toolsが入っていない方は、以下のコマンドをターミナルで実行して入れましょう。
xcode-select --install
僕は、CMake(ビルドを自動化するもの)が入っていなかったので、Homebrewでインストールします。
brew install cmake
インストールされたか確認しましょう。
cmake --version
これで事前準備は終わりです。
プロジェクトを作成する
作業用ディレクトリを作ります。
HelloWorldという名前のフォルダを作りました。SDLを使ったプロジェクトのフォルダです。HelloWorldは好きな名前で構いません。(僕はDesktop直下に作りましたが、どこでも構いません。)
その後、cdコマンドでHelloWorldに移動しましょう。
mkdir ~/Desktop/HelloWorld
cd ~/Desktop/HelloWorld
SDL3をプロジェクト内にcloneする
SDLをHelloWorldにcloneします。
git clone https://github.com/libsdl-org/SDL.git vendored/SDL
これで以下のような構成になっているか確認してください。
HelloWorld/
vendored/
SDL/
main.cppを作成する
プロジェクト直下に main.cpp を作成しましょう。
touch main.cpp
main.cpp に以下のコードを貼り付けましょう。
#include <SDL3/SDL.h>
#include <iostream>
int main()
{
if (!SDL_Init(SDL_INIT_VIDEO))
{
std::cerr << "SDL_Init failed: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window* window;
SDL_Renderer* renderer;
if (!SDL_CreateWindowAndRenderer(
"HelloWorld",
800,
600,
SDL_WINDOW_RESIZABLE,
&window,
&renderer))
{
std::cerr << "SDL_CreateWindowAndRenderer failed: "
<< SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
bool running = true;
while (running)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_EVENT_QUIT)
{
running = false;
}
}
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Delay(16);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
CMakeLists.txtを作成する
プロジェクト直下に CMakeLists.txt を作ります。
touch CMakeLists.txt
中身は以下です。
cmake_minimum_required(VERSION 3.16)
project(helloWorld)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
add_subdirectory(vendored/SDL EXCLUDE_FROM_ALL)
add_executable(helloWorld main.cpp)
target_link_libraries(helloWorld PRIVATE SDL3::SDL3)
ビルドする
プロジェクト直下、つまり HelloWorld ディレクトリで以下を実行します。
cmake -S . -B build
cmake --build build
cmake -S . -B build は、CMakeにビルド準備をさせるコマンドです。
cmake --build build は、build ディレクトリに作られたビルド設定を使って、実際にコンパイルするコマンドです。
実行!
以下のコマンドをターミナルで実行しましょう。
./build/helloWorld
画面にウィンドウができて、赤色に塗りつぶされていたら成功です。
つまずいたこと
最初は clang++ main.cpp のように直接コンパイルしようとして、以下のエラーが出ました。
fatal error: 'SDL3/SDL.h' file not found
これはSDL3が入っていないのではなく、コンパイラにSDL3の場所を教えていないことが原因でした。
vendored SDL方式では、CMakeLists.txt にSDL3の読み込みとリンク設定を書き、CMake経由でビルドすることで解決できました。
まとめ
今回は、MacでC++からSDL3を使うために、vendored SDL方式で環境構築しました。
大まかな流れは以下です。
mkdir HelloWorld
cd HelloWorld
git clone https://github.com/libsdl-org/SDL.git vendored/SDL
touch main.cpp
touch CMakeLists.txt
cmake -S . -B build
cmake --build build
./build/HelloWorld
あとがき
HelloWorld という名前にしたのは、SDLでHelloWorldと表示したかったからです。しかし、SDLだけでは、文字描画する関数がありませんでした。追加ライブラリで、SDL_ttfが必要だそうです。また、これについて記事を書けたらと思います。
AIの利用について
この記事では、手順の整理や文章の推敲にChatGPTを使用しました。
コードやコマンドは、自分の環境で実際に動作確認しています。