かくことない

かもしれない

Vcpkg+CMakeでのSDL2ビルド

C++用パッケージマネージャVcpkgと C系言語用ビルドソフトCMakeと組み合わせてSDL2をビルドした。

環境

この記事の内容はWIndows10でなくてもおおむね問題なく使えるはず。 なお、CMakeは既に導入済みとして話を進める。

Vcpkgの導入

READMEに従い導入を進める。

Vcpkgのレポジトリをcloneし、中にあるbootstrap-vcpkg.bat(Linux等ではbootstrap-vcpkg.sh)を実行する。

> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg
> .\bootstrap-vcpkg.bat

Vcpkgとビルドシステムを連携するために、integrate installコマンドを実行する(管理者権限が必要)。

> .\vcpkg integrate install

尚、必要に応じてPATHを通してもよい(自分は面倒で通してない :P)。

SDL2の導入

vcpkg installを使用する。

> .\vcpkg install sdl2 --triplet x64-windows

--tripletオプションの引数は環境によって変える。 有効な引数は.\vcpkg help tripletから見れる(後々変わるかもしれないので、一応自分で実行したほうがいいかもしれない)。

> .\vcpkg help triplet
Available architecture triplets:
  arm-uwp
  arm-windows
  arm64-uwp
  arm64-windows
  x64-linux
  x64-osx
  x64-uwp
  x64-windows
  x64-windows-static
  x86-uwp
  x86-windows
  x86-windows-static

ビルド

最初に、CMakeLists.txtを書く。 vcpkg install完了時に表示されるスニペットを参考にする。

project(main)

find_package(sdl2 CONFIG REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main PRIVATE SDL2::SDL2 SDL2::SDL2main)

次にcmakeを実行し、ビルドスクリプトを作成する。 今回はCMakeLists.txtを同じディレクトリで実行したとして書く。 実際にはbuildとかそういうビルド用のディレクトリを作ってそこでやった方がいいと思う。

> cmake . "-DCMAKE_TOOLCHAIN_FILE=<vcpkg_root>\scripts\buildsystems\vcpkg.cmake" -A x64

<vcpkg_root>にはVcpkgがあるディレクトリを指定する。

-A x64は使用するビルドジェネレータやビルド対象とするアーキテクチャによって変えること。

例えば、Ninjaで64ビットのWindowsを対象にビルドする場合は

> cmake . "-DCMAKE_TOOLCHAIN_FILE=<vcpkg_root>\scripts\buildsystems\vcpkg.cmake" -G Ninja -DVCPKG_TARGET_TRIPLET=x64-windows

となる。

最後に、cmake --buildでビルドする。

> cmake --build .

ここで指定するディレクトリは先程ビルドスクリプトを作成したディレクトリであることに注意しよう。 メインのCMakeLists.txtがある場所とは限らない。

リンクエラーが出たら

私の場合、リンクエラー(LNK2019)が出てしまいビルドが成功しなかった。

理由はSDL2はmainにマクロを入れており、 コマンドライン引数を明示しないとそのマクロが動作せずリンクエラーとなる(参考)。

int main() // ダメ!
int main(int argc, char* argv[]) // よし!