前書き/方針
- このページには、筆者が、D言語+SDLでGUIアプリを開発する為の環境をwindows上に整えた際の備忘録を記録する。
- 筆者はD言語に対する愛は無い(あちこちの仕様がどうも気に入らない)。SDLは普通(但し、自分でコンパイルしろと言われたら面倒すぎるが)。
- 基本的に、なるべくソースだけあれば再構築できるような構造にする。
- D言語標準でないライブラリ群(大部分がSDL関連)はソースに同梱する。
- ビルドツールは今のところは使わない。build.batを書く。
- *.libや*.dllは利用可能な状態になっているものをソースに同梱する。
- http://www5.atwiki.jp/yaruhara/pages/74.html を基本にする。
インストール
bcc
- *.dll等を利用できるようにする際に、bccの各ツールがあった方が良いようだ。
- 既にD言語から利用できる状態の*.lib等があるなら不要。
- インストール手順の詳細は省略。
DMD
プロジェクト開始
今回は、実際にバイナリ構築環境を整えつつ、その都度、必要になった要素を追加していく方針とする。
IDEっぽい事は拒否するので、プロジェクト全体は単なる一つのディレクトリとする。
(このディレクトリは、あとでリポジトリに保存するが、今は省略する)
基本的には、以下のページをベースに始めてみた。
プロジェクトディレクトリ作成
- プロジェクト名を決め、その名前のディレクトリを作る。
- その中に、「src」「data」の二つのサブディレクトリを作成する。
- srcには構築に必要なソース一式を入れる
- dataには*.exe完成後に読み込む各種データ(画像や音声等)を入れる
srcの整備
SDL設置
- http://shinh.skr.jp/d/porting.html から、SDL.zipをもらってきて、src/SDL として設置する。
- 但し、これは最新版からちょっとバージョンが古い。しかし、自分で用意するのは面倒なので、これを使う。
- その後、その中にあるSDL.dllを、プロジェクトディレクトリのroot(=build.batのあるディレクトリ=生成されるべき*.exeと同じディレクトリ)に移動させる。
- *.exe実行時に、SDL.dllが必要になる為。
動作確認
- 簡単なmain.dを書いてみて、build.batを実行し、生成された*.exeが動作する事を確認する。
他のライブラリを追加
SDL_ttf
SDL_mixer
- SDL_ttfと同様。
- ……の筈が、何故か、SDL_mixer.dll内で「SDL_errorがSDL.dllから見付からない」というエラーが発生する。
- どうも、SDL本体のバージョンが上がった際に、内部のAPIか何かが変更になったらしく、その時にSDL_mixerの方もそれに追随して変更になったのが原因のように思える。
- 具体的にどのバージョンからそうなったのかを調べる手掛かりが無いので、手で一つずつバージョンを下げて、動くバージョンを探した。
SDL_image
- SDL_mixerと同様。これも同じエラーが発生したので、エラーが出ないバージョンにまで戻した。1.2.3が機能した。
SDL_net
その他
スケルトン
- ここまで作ったサンプルをベースにして、実際の開発を行う。
問題点
- プロジェクトディレクトリが*.dllだらけになった。
- どうにかすれば、*.exe内にスタティックリンク可能?
- 或いは、arみたいなツールを使って、一つのdllにまとめる事は可能?
罠
- D言語の文字列の扱いはC言語のそれとは違う。
- D言語の文字列はchar[]であり可変長配列。\0終端とは限らない。toStringz()でC言語の文字列にできる(末尾に\0が付与される)。
- C言語の文字列はchar*であり、ポインタの指している内容は不定。\0終端の必要有り。toString()でD言語の文字列にできる(charの可変長配列になる)。
- SDL等の、Cで書かれた外部dllに文字列を渡す際には、必ずC文字列にしてから渡す必要がある。
- 但し、"hoge"形式で渡す場合はインテリジェントに対応してくれるっぽい。
- printf()はC文字列を要求する。writef()はD文字列を要求する。
- 尚、D言語の可変長配列は、単なるメモリ上の並びでは無い為、可変長配列に対して、char *str_ptr = &str[0];のような事をやってはいけない。これをやってもstr_ptrからは怪しいデータしか読めない。segvで死んでもしらない。
- ttfフォントは色々とライセンス問題がある事が多い為、同梱する場合は必ずライセンスを確認する必要がある。
- fontsに、昔に手元のフォントを調査した内容がある。
- 音声ファイルもライセンスで困る事が多い。可能なら自作したいところ。
- 画像も同じく。
- *.exeのアイコンは*.resで設定するが、起動後のプロセスのアイコンはSDL_WM_SetIcon()で設定する。
TODO
ライセンス
SDL回りは様々なものが含まれるので、ライセンス関係が厄介。
基本的にはLGPLとして扱えば問題は無い筈だが、もし漏れがあると困る為、リストアップする。
- dmd : 修正BSD風+何か。とりあえずコンパイル後のバイナリには影響しないっぽい
- dmc : 修正BSD風+何か。とりあえずコンパイル後のバイナリには影響しないっぽい
- SDL : 1.2系(安定版)はLGPL。1.3系(開発版)はLGPLまたは商用の好きな方を選べる。
- SDL_ttf : LGPL
- freetype : 修正前BSD風またはGPL
- zlib : 修正BSD風
- SDL_mixer : LGPL
- timidity : GPLまたはLGPLまたはPerl Artistic
- ogg vorbis : (修正?)BSD風
- smpeg : LGPL
- libmad : GPL(但し、おそらく、このSDL_mixer.dllには含まれてない)
- SDL_image : LGPL
- SDL_imageに含まれるlibjpegとかlibpngとか : 調べるの面倒になったので、LGPLを信じる
- SDL_net : LGPL
実際の制作物
参考リンク
ものすごく未整頓。
最終更新 : 2007/10/05 11:50:40 JST