LoginSignup
4
7

More than 1 year has passed since last update.

Visual Studio 2019でSDL2を静的リンクさせる覚書

Last updated at Posted at 2018-04-05

概要

Visual C++とSDL2を静的リンクさせることができたので、手順を書き残しておきます。
個人的によくお世話になるSDL2+OpenGL2の環境でやってみます。

動作環境と前提条件

  • Microsoft Visual Studio 2019
    • Visual C++の開発環境が必要です。
  • SDL2(v2.0.10)
  • 今回は32bitの実行ファイルを作成します。

前準備

Visual Studio 2019のインストール

Visual Studio 2019 Communityをインストールします。手順は割愛。
既定ではVC++の開発環境は入らないので、インストール時にVisual C++コンポーネントを含めるようにします。

CMakeのインストール

ここからWindows用のCMakeをダウンロードします。
私はWindows win64-x64 ZIPを選択しました。
ZIP版の場合は(CMakeをインストールしたディレクトリ)\binを環境変数のPathに追記する必要があります。

SDL2のインストール

ここから入手します。
今回はSDL2をソースコードからビルドするため、SDL2-2.0.10.zipをダウンロードします。
ファイルを展開して任意のディレクトリに保存してください。
今回は以下の場所に格納しました。
C:\dev\SDL2-2.0.10

SDL2のビルド

上記のSDL2を配置したディレクトリ上でコマンドプロンプトを立ち上げます。
ここで、SDL2をVisual Studio 2019でビルドするソリューションを作成するため、CMakeコマンドを実行します。

md build
cd build
cmake -G "Visual Studio 16 2019" -A Win32 ..

(SDL2をインストールしたディレクトリ)\build\の中に作成されたSDL2.slnをVisual Studioで開きます。
ソリューション構成の中にいくつかありますが、DebugReleaseに対してそれぞれビルドします。
(SDL2をインストールしたディレクトリ)\build\(DebugまたはRelease)の中の以下のファイルを使用します。

  • Debug
    • SDL2maind.lib
    • SDL2-staticd.lib
  • Release
    • SDL2main.lib
    • SDL2-static.lib

Visual C++プロジェクトの作成と設定

プロジェクトの作成

Visual Studio 2019で新しいプロジェクトを作成します。
Windows デスクトップ ウィザードで作成します。
途中表示されるオプションで、

  • アプリケーションの種類: デスクトップ アプリケーション (.exe)
  • 追加のオプション: 空のプロジェクトだけにチェック
    として完了します。

SDL2のファイルを配置

(SDL2をインストールしたディレクトリ)/includeの中のファイルを(プロジェクトのディレクトリ)/include/SDL2にコピーします。
(SDL2をインストールしたディレクトリ)/build/includeの中のファイルを(プロジェクトのディレクトリ)/include/SDL2に上書きコピーします。
(プロジェクトのディレクトリ)/libの中にDebugとReleaseでディレクトリを切って、それぞれの中に対応するSDL2のlibファイルを配置します。

プロジェクトの設定

すべての構成

全般

  • 構成の種類: アプリケーション (.exe)
  • 文字セット: マルチバイト文字セットを使用する
  • 出力ディレクトリ: $(SolutionDir)bin\$(Configuration)\
  • 中間ディレクトリ: $(SolutionDir)obj\$(Configuration)\

VC++ ディレクトリ

  • インクルードディレクトリ:
    $(ProjectDir)include
    $(ProjectDir)include\SDL2
  • ライブラリディレクトリ:
    $(ProjectDir)lib\$(Configuration)

リンカー

  • システム
    • サブシステム: Windows (/SUBSYSTEM:WINDOWS)

Debug

リンカー

  • 入力
    • 追加の依存ファイル:
      SDL2maind.lib
      SDL2-staticd.lib
      opengl32.lib
      version.lib
      winmm.lib
      imm32.lib
      setupapi.lib

Release

C/C++

  • 全般
    • デバッグ情報の形式: なし

リンカー

  • 入力
    • 追加の依存ファイル:
      SDL2main.lib
      SDL2-static.lib
      opengl32.lib
      version.lib
      winmm.lib
      imm32.lib
      setupapi.lib
  • マニフェストファイル
    • マニフェストの生成: いいえ (/MANIFEST:NO)
  • デバッグ
    • デバッグ情報の生成: いいえ
  • 最適化
    • リンク時のコード生成: 既定

ビルドしてみる

cppファイルを作成し、以下のコードを記述します。

main.cpp
#include "SDL.h"
#include "SDL_opengl.h"

int main(int argc, char** argv) {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_DisplayMode current;
    SDL_GetCurrentDisplayMode(0, &current);
    SDL_Window* window = SDL_CreateWindow("SDL2 static linking with VC++",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        640, 480,
        SDL_WINDOW_OPENGL);
    SDL_GLContext glContext = SDL_GL_CreateContext(window);

    SDL_Event ev;
    bool running = true;
    while (running) {
        while (SDL_PollEvent(&ev)) {
            if (ev.type == SDL_QUIT)
                running = false;
        }

        glViewport(0, 0, 640, 480);
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        SDL_GL_SwapWindow(window);
    }

    SDL_GL_DeleteContext(glContext);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

ビルドして実行すると、真っ黒な中身のウィンドウが立ち上がります。
また、Debugで実行した場合、ブレークポイントを設定して止めることもできます。

SDL2のアプリケーションをDLLなしで動かせるようになりました。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7