2018/03/11(日) [n年前の日記]
#1 [windows][mruby] Visual Studio 2015上でSDL2を使った何かをビルド
Windows10 x64 上で、mruby + SDL2 を動かしてみたいのだけど。その前に、Visual Studio 上で SDL2 を使った何かしらをビルドできる状態にしておかないといかんのだろうと想像するわけで。
ということで、Windows10 x64 + Visual Studio 2015 Community で、SDL2 を使った何かをビルドできそうかどうか実験。
ということで、Windows10 x64 + Visual Studio 2015 Community で、SDL2 を使った何かをビルドできそうかどうか実験。
◎ SDL2関係のファイルを入手 :
Visual Studio で SDL2 を利用するなら、以下のファイルが必要らしい。
以下から入手する。
_Simple DirectMedia Layer - SDL version 2.0.8 (stable)
_SDL_image 2.0
_SDL_mixer 2.0
_SDL_ttf 2.0
_SDL_net 2.0
一々ページを開いてDLするのが面倒なら、以下のリストを使って…。
_urls.txt
wget にURLリストファイルを渡して、一気にDLする、とか。
_wgetでこういう時はこうする!! - Qiita
zip群をDLできたら、解凍する。今回は D:\sdl2\dev\vc\ 以下にコピーした。includeフォルダ内に *.h を、libフォルダ内に *.lib と *.dll をまとめておく。lib は、x86 と x64 (32bit版と64bit版)があるので、今回は x86 版を使って作業した。
- SDL2-devel-2.0.8-VC.zip (Visual C++ 32/64-bit)
- SDL2_image-devel-2.0.3-VC.zip (Visual C++ 32/64-bit)
- SDL2_mixer-devel-2.0.2-VC.zip (Visual C++ 32/64-bit)
- SDL2_ttf-devel-2.0.14-VC.zip (Visual C++ 32/64-bit)
- SDL2_net-devel-2.0.1-VC.zip (Visual C++ 32/64-bit)
以下から入手する。
_Simple DirectMedia Layer - SDL version 2.0.8 (stable)
_SDL_image 2.0
_SDL_mixer 2.0
_SDL_ttf 2.0
_SDL_net 2.0
一々ページを開いてDLするのが面倒なら、以下のリストを使って…。
_urls.txt
https://www.libsdl.org/release/SDL2-devel-2.0.8-VC.zip https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.3-VC.zip https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.2-VC.zip https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-2.0.14-VC.zip https://www.libsdl.org/projects/SDL_net/release/SDL2_net-devel-2.0.1-VC.zip
wget にURLリストファイルを渡して、一気にDLする、とか。
wget --no-check-certificate -i urls.txtwget を使ってhttpsサーバにアクセスさせる時は、wget --no-check-certificate をつけるといいらしい。
_wgetでこういう時はこうする!! - Qiita
zip群をDLできたら、解凍する。今回は D:\sdl2\dev\vc\ 以下にコピーした。includeフォルダ内に *.h を、libフォルダ内に *.lib と *.dll をまとめておく。lib は、x86 と x64 (32bit版と64bit版)があるので、今回は x86 版を使って作業した。
◎ VS2015でプロジェクトを作成。 :
ファイル → 新規作成 → プロジェクト → Visual C++ → Win32 → Win32コンソールアプリケーション。
Win32アプリケーションウイザードが開くので、空のプロジェクト、にのみチェックを入れて、プロジェクトを新規作成。
ソリューションエクスプローラーで、ソースファイルを右クリック → 追加 → 新しい項目 → main.cpp を追加。
main.cpp の内容は以下にする。ウインドウを開いて2秒経ったら閉じる、という処理らしい。
_開発環境 Linux | ゲーム作ろう
Win32アプリケーションウイザードが開くので、空のプロジェクト、にのみチェックを入れて、プロジェクトを新規作成。
ソリューションエクスプローラーで、ソースファイルを右クリック → 追加 → 新しい項目 → main.cpp を追加。
main.cpp の内容は以下にする。ウインドウを開いて2秒経ったら閉じる、という処理らしい。
_開発環境 Linux | ゲーム作ろう
#include <SDL.h> int main(int argc, char *argv[]) { SDL_Window* win = NULL; if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) { return 1; } win = SDL_CreateWindow("hello", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); if( ! win ) { return 1; } SDL_Delay(2000); SDL_DestroyWindow( win ); SDL_Quit(); return 0; }
◎ プロジェクトのプロパティを設定。 :
プロジェクト → プロパティ。構成を「すべての構成」に。
リンカー → 入力 → 追加の依存ファイル → 以下を追加。
リンカー → システム → サブシステム → Windows(/SUBSYTEM:WINDOWS) に変更。
C/C++ → コード生成 → ランタイムライブラリ → /MT に変更。これで静的リンクがされるらしい。が、このへんよく分かってない。メモリリークがどうのこうのという話もあるらしいけど…。
- VC++ディレクトリ → インクルードディレクトリに、SDL2 の includeフォルダを追加。
- VC++ディレクトリ → ライブラリディレクトリに、SDL2 の lib でディレクトリを追加。
リンカー → 入力 → 追加の依存ファイル → 以下を追加。
SDL2main.lib SDL2.lib
リンカー → システム → サブシステム → Windows(/SUBSYTEM:WINDOWS) に変更。
C/C++ → コード生成 → ランタイムライブラリ → /MT に変更。これで静的リンクがされるらしい。が、このへんよく分かってない。メモリリークがどうのこうのという話もあるらしいけど…。
◎ ビルドしてみる。 :
ビルド → ソリューションのビルド。正常終了と表示されたらいいな。
F5キーを押して実行。
「SDL2.dll が見つからないため、コードの実行を続行できません。」とエラーメッセージが表示された。
DL・解凍した、SDL2 の libディレクトリ内に、*.dll がたくさん入っているので…。プロジェクトの保存ディレクトリ内の、DebugディレクトリやReleaseディレクトリの中に、*.dll をごっそりコピーする。
再度 F5キーを押して実行。今度はウインドウが表示された。
ということで、Visual Studio 上でビルドはできる、ようではあるなと…。
F5キーを押して実行。
「SDL2.dll が見つからないため、コードの実行を続行できません。」とエラーメッセージが表示された。
DL・解凍した、SDL2 の libディレクトリ内に、*.dll がたくさん入っているので…。プロジェクトの保存ディレクトリ内の、DebugディレクトリやReleaseディレクトリの中に、*.dll をごっそりコピーする。
再度 F5キーを押して実行。今度はウインドウが表示された。
ということで、Visual Studio 上でビルドはできる、ようではあるなと…。
◎ 画像を表示したい。 :
せっかくだから画像を表示してみたい。main.cpp を以下の内容にして、(Debug|Release)ディレクトリに sample.bmp や sample.png を置いて実験。
Visual Studio 上で F5キーを叩いてみたけど、画像が表示されない…。(Debug|Release)ディレクトリ内に出来上がった .exe を実行すると、画像が表示されるのだけど…。
Visual Studio の作業ディレクトリ設定を変更しないといけないらしい。デフォルトでは、プロジェクトディレクトリが作業ディレクトリになっているので、プロジェクト → 〜のプロパティ → デバッグ → 作業ディレクトリ → 「参照」を選んで、Releaseディレクトリ、もしくは、Debugディレクトリを選択してやることで、任意の作業ディレクトリを設定することができる。
これで、Visual Studio 上で F5キーを叩いた時も、画像が表示されるようになった。
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> // #include <stdio.h> // #include <string> #include <iostream> // #include <fstream> int main(int argc, char *argv[]) { SDL_Window* win = NULL; SDL_Renderer *renderer; SDL_Surface *image; SDL_Texture *tex; SDL_Event ev; if (SDL_Init(SDL_INIT_VIDEO) < 0) { return 1; } win = SDL_CreateWindow("hello", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); if (!win) { return 1; } renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); IMG_Init(IMG_INIT_PNG); image = IMG_Load("sample.png"); // image = SDL_LoadBMP("sample.bmp"); if (image == NULL) { return 1; } tex = SDL_CreateTextureFromSurface(renderer, image); SDL_FreeSurface(image); while (true) { SDL_SetRenderDrawColor(renderer, 32, 160, 64, 255); SDL_RenderClear(renderer); if (SDL_PollEvent(&ev)) { if (ev.type == SDL_QUIT) { break; } } SDL_RenderCopy(renderer, tex, NULL, NULL); SDL_RenderPresent(renderer); SDL_Delay(10); } IMG_Quit(); SDL_DestroyTexture(tex); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(win); SDL_Quit(); return 0; }
Visual Studio 上で F5キーを叩いてみたけど、画像が表示されない…。(Debug|Release)ディレクトリ内に出来上がった .exe を実行すると、画像が表示されるのだけど…。
Visual Studio の作業ディレクトリ設定を変更しないといけないらしい。デフォルトでは、プロジェクトディレクトリが作業ディレクトリになっているので、プロジェクト → 〜のプロパティ → デバッグ → 作業ディレクトリ → 「参照」を選んで、Releaseディレクトリ、もしくは、Debugディレクトリを選択してやることで、任意の作業ディレクトリを設定することができる。
これで、Visual Studio 上で F5キーを叩いた時も、画像が表示されるようになった。
◎ 文字列の出力ができない。 :
処理が失敗した時に何かメッセージを出力するようにしてみたかったのだけど、やり方が分からない…。
#include <iostream> をして、std::cout << "hoge" << std::endl; で出力できたりしないのかな…。それとも、#include <stdio.h> を書いて、printf("hoge"); とか。でも、どこにも文字列が出力されてないような。
#include <iostream> をして、std::cout << "hoge" << std::endl; で出力できたりしないのかな…。それとも、#include <stdio.h> を書いて、printf("hoge"); とか。でも、どこにも文字列が出力されてないような。
◎ 参考ページ。 :
_Setting up SDL2 with Visual Studio 2015 | Gigi Labs
_[SDL2 - Part 1b] Setting up Visual Studio for SDL2 - headerphile
_開発環境 Linux | ゲーム作ろう
_開発環境 Windows | ゲーム作ろう
_SDL2のビルド環境構築 - Narrow Escape
_windowsでSDLを使う - Qiita
_VisualStudioでのランタイムライブラリのリンク方法指定 - ダンボール
_VisualC++でランタイムに依存しないSDLプログラミングまとめ
_C++ SDL 2.0 Tutorial 1: Setting Up SDL - YouTube _メモ VisualStudio作業ディレクトリ
_[SDL2 - Part 1b] Setting up Visual Studio for SDL2 - headerphile
_開発環境 Linux | ゲーム作ろう
_開発環境 Windows | ゲーム作ろう
_SDL2のビルド環境構築 - Narrow Escape
_windowsでSDLを使う - Qiita
_VisualStudioでのランタイムライブラリのリンク方法指定 - ダンボール
_VisualC++でランタイムに依存しないSDLプログラミングまとめ
_C++ SDL 2.0 Tutorial 1: Setting Up SDL - YouTube _メモ VisualStudio作業ディレクトリ
[ ツッコむ ]
以上です。