mrubyで知識0から始める試行錯誤GCC+SDL+OpenGLプログラミング

とりあえずコンパイルができて何とかなりそうな気がしたので、いじった結果を書いていくことにする。タグを新設しておいた。
うちで普段書くプログラムはRubyか、VCを使ったCになる。あとWin32APIとDirectX9。そんな俺がGCCを使ってSDL+OpenGLのmrubyアプリに挑戦しようと言うのだから、これはもう何から何まで初めてということになる。あ、Cだけできます( ー`дー´)キリッ
見事にド素人なので悩んだり詰まったりしつつ、なんか動くものができたらいいな、と。
Windowsで。


まず環境をどうにかしないといけない。が、オープンソースの世界はなんか難しくてよくわからない。とりあえず手軽に用意できるものはなるべく手軽に用意する。
gccはRubyInstallerのDevKitでインストールしたやつを使う。こっからダウンロードできる。mingw版のgccだ。
http://rubyinstaller.org/downloads/
英語はよくわからんけど書いてある通りにコマンド叩いたら使えるようになった。
https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
RubyInstallerはそのままインストールするとC:\Ruby193にインストールされる。DevKitはC:\Ruby193\mingwの下に色々入るが、C:\Ruby193の下にも少し入っている。devkitvars.batで通常のコマンドプロンプトからgccが使えるようになる。msys.batでmingwのプロンプトもつかえるようだ。
ちなみにこの間からやってるmrubyのコンパイルはこのgccを使っている。makeってするだけでコンパイルできるかららくちん。

次はSDL。これがまたさっぱりわからない。SDLのサイト(http://www.libsdl.org/download-1.2.php)からDevelopment Librariesを落としてきてもGCCコンパイルオプションがわからんからコンパイルが通らない。
とりあえずSDLをビルドしてみたら何かヒントがつかめるかも、ってことで、SDLのサイトからソースを落としてきて(一番上のSDL-1.2.15.zipを落としてみた)、適当な場所に展開する。
ビルド方法はLSI設計雑記帳さま(http://lsifrontend.blog100.fc2.com/blog-entry-162.html)を参考にした。configureとかするみたいだからmingw環境での操作になる。msys.bat動かして、cdでソース展開したところに移動して、configureしてmakeしてmake insallしたらビルドできた。ついでにtestもビルドして、testwin.exeが動くところまで確認。testgl.exeというOpenGLのテストもあったので動かしたらちゃんと動いた。OpenGLについて何もしてないのに使えるようになったらしい。すごい。意味がわからない。
testwin.exeはExplorerから起動するとSDL.dllが無いと怒られる。パスが通ったところに無いらしい。探してみたらC:\Ruby193\mingw\binの下にいた。exeと同じディレクトリにコピーしたら動くようになる。

testをビルドしたときにgccコンパイルオプションが見れた。普通に右クリックはなぜかできないけど、左上のメニューから編集→範囲選択でコピペできた。こんな感じ。

gcc -o testwin.exe testwin.c -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DHAVE_OPENGL -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows

testglはこうだった

gcc -o testgl.exe testgl.c -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DHAVE_OPENGL -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows  -lopengl32

一番後ろに-lopengl32が増えただけだ。なんしかこのようなオプションをつけないとコンパイルできないようだ。検索しても--sdl-config -libsとかしか書いてなくてさっぱりわからんかったよ。ていうかわかるわけねーし。

普段の環境である通常のコマンドプロンプトから自分で作ったソースをコンパイルしてみる。
とりあえず、検索してたら出てきた紅音製作所さま(http://www5.big.or.jp/~high/VENIO/kuz/index.htm)のサンプルコードを切り貼りして動きそうな形に仕上げる。

#include <SDL.h>

SDL_Surface *mWIN;//メインウィンドウ

void startUp(void)
{
  
  if(SDL_Init(SDL_INIT_VIDEO)==-1) SDL_Quit();
  mWIN=SDL_SetVideoMode(300,400,32,SDL_SWSURFACE);
  SDL_WM_SetCaption("Inbeida",NULL);
}

int quits()
{
SDL_Event Qevnts;
if(SDL_PollEvent(&Qevnts))
   {
   switch(Qevnts.type)
      {
      case SDL_QUIT:
        return 0;
        break;

     case SDL_KEYDOWN:
        if(Qevnts.key.keysym.sym==SDLK_ESCAPE ||
           Qevnts.key.keysym.sym==SDLK_q) return 0;
        break;

     default: break;
     }
   }
return 1;
}

int main(int argc, char *argv[])
{
  startUp();

  while(quits()!=0);
  SDL_Quit();
  return 0;
}

意味はわからんけど動きさえすれば問題は無い。
コンパイルはこのような感じで。includeとlibのディレクトリ指定をさっきのやつからフルパスに変えた。

gcc -o glmruby.exe glmruby.c -g -O2 -Ic:/ruby193/mingw/include/sdl -D_GNU_SOURCE=1 -Dmain=SDL_main -DHAVE_OPENGL -Lc:/ruby193/minw/lib -lmingw32 -lSDLmain -lSDL -mwindows

ファイル名が安直すぎてごめんなさいorz
SDL.dllをこのディレクトリにコピーして、できあがったexeを動かしたら動いた。

なんとかなりそうじゃね?右上の×を押したら閉じるけど、ALT+F4で閉じれないのはそんなもん?よくわからんけどまあいいや。とにかく動いた。