<戻る

ライブラリ化の勧め


 DirectXでゲームを作るとなると、非常にたくさんのクラスを作成することになります。1つのプロジェクトの中でライブラリとしてのクラスと実用段階の「使い捨て系」クラスとをごちゃ混ぜにするのはあまり好ましくはありません。殆ど変更しなくなってきたクラスについては「ライブラリ化」をしてすっきり整理することをお勧めします。



@ スタティックライブラリとダイナミックリンクライブラリ

 ライブラリには大きく2種類存在します。1つは「スタティックライブラリ」。これはプログラムに組み込んで最終的に実行ファイル形式内にソースを固定してしまうライブラリです。実行ファイルを作成してしまったら変更が出来ないので「スタティック(静的)」と名付けられています。拡張子はlibです。もう1つは「ダイナミックリンクライブラリ」。これは実行ファイルの中にソースを含めず、実行中にライブラリを展開してその実行バイナリコードを使用できるライブラリです。実行ファイルを作成した後もライブラリ自体の変更が可能で、それにより実行ファイルの機能を変えたり拡張できたりするので「ダイナミック(動的)」と名付けられています。拡張子はdllです。

 どちらのライブラリにも一長一短があります。libの方はプログラムソースとして完全に固定してしまうので、完全に動くプログラムを保証します。しかし、作成された実行ファイルは変更ができないので、バージョンアップをするときには実行ファイルごとコンパイルしなおさなければなりません。dllの方は実行ファイルが外部ソースとしてアクセスするので、dllを丸ごと取り替えてしまえば異なる動作をさせることが可能になります。これはソフトのバージョンアップやパッチ修正を容易にします。しかし、dllによるアクセスは一般に手続きが多く、またdllが無い場合や壊れている場合に実行ファイルの動作保証ができなくなります。また、実行ファイルは完全にdllを意識した書き方になります。

 dllの作成は難しくはありませんが、その後の扱いが少し面倒になりますので、今回はスタティックライブラリとしてまとめる方法を示します。



A スタティックライブラリの仕組み

 スタティックライブラリ自体は「ソースコード」「実装部」です。よって、スタティックライブラリを自分のプログラムにリンクするとソースを使えるようになります。ただ、クラスライブラリとして作成した場合は、スタティックライブラリだけではプログラムは動きません。これはプログラムを実装部だけで動かそうとしているからです。クラスの場合必ず「宣言部」が必要になりますね。つまり、スタティッククラスライブラリを動かすにはヘッダーファイルもリンクする必要があるのです。

 

B スタティックライブラリを作成する

 VC++6で話を進めます。スタティックライブラリを作成するには、それ専用のプロジェクトを新規作成する必要があります。まず、[ファイル]→[新規作成]を選択し新規作成ウィンドウからプロジェクトタグをクリックします。そこにあるWin32 Static Libraryを選択して、プロジェクト名を決めます。[OK]を押すとスタティックライブラリにプリコンパイル済みヘッダーを含めるか、またMFCをサポートするかという選択肢が出てきます。プリコンパイル済みヘッダーを含めると、自動的にStdAfx.hが組み込まれます。MFCを使っている場合はMFCサポートを入れなければなりません。必要なチェックをして[終了]をクリックすると、スタティックライブラリを作成するワークスペースが開きます。

 後は非常に簡単で、ライブラリに組み込みたいクラスを[プロジェクト]→[プロジェクトへ追加]→[ファイル]で宣言部・実装部とも追加し、コンパイルするだけです。Debugでコンパイルすればデバックバージョンのライブラリが、Releaseでコンパイルすればリリース版がそれぞれのフォルダ内に作成されます。

 このように作成はとても簡単なのですが、このままだと別のプロジェクトで使用する時にいちいちライブラリをコピーしてこなくてはならなくなります。汎用的に使おうと考えてのライブラリ化なのですから、ここは汎用ライブラリフォルダを別に設けて、そこに出力するように変更するべきでしょう。これは、[プロジェクト]→[プロジェクトの設定]を選択して、出てきたウィンドウの[ライブラリ]タグをクリックし、出力ファイル名に作成したフォルダへのフルパスを記入します。相対パスはダメです。Release版だけを汎用フォルダに格納するならば、[設定の対象]と書かれたコンボボックスから[Win32 Release]を選択して、パスを通します。



C スタティックライブラリを作成しながら本番プログラムも作る

 スタティックライブラリは開発の初期段階ではまだ未熟です。これを少しずつ成長して固めながら、使えるものに磨き上げていきます。しかし、ライブラリを変更する度にワークスペースを開いてコンパイルし直すのは正直面倒だったりします。ライブラリに組み込んでいるクラスを変更・追加しつつ、本番のプログラムでその動作をチェックしていく。そういう開発が理想ですね(もちろん個人ベースでの話です)。

 これを実現するには「プロジェクトの追加」を行います。

 まず、本番プログラムのワークスペースを作成します。これはいつもされている方法でかまいません。ワークスペースが出来たら、[プロジェクト]→[プロジェクトをワークスペースへ挿入]を選択します。するとプロジェクト選択ウィンドウが出てきますので、スタティックライブラリ作成用に作ったプロジェクトファイル(.dsp)を選択します。これで、本番プログラムの中にスタティックライブラリのプロジェクトが追加され、編集が出来るようになります。

 スタティックライブラリの変更や追加を行うときには、[プロジェクト]→[アクティブプロジェクトに設定]からスタティックライブラリのプロジェクトを選択します。変更や追加を行ってコンパイルをすると、ライブラリが更新されます。本番プログラムに戻るときには、同様の手順で本番のプロジェクトを選択してコンパイルすればOKです。

 本番プログラムのコンパイル時には大抵はコンパイルエラーが出ます。多くは「ヘッダーファイルがわからん」というエラーとリンカーエラーです。ヘッダーファイルの所在は、スタティックライブラリ内のクラスのヘッダー部へパスを通せば解決します。リンカーエラーはライブラリを読み込んでいないのが原因です。これは、[プロジェクト]→[設定]を選択して、出てきたウィンドウ内の[リンク]タグをクリックし、[オブジェクト/ライブラリモジュール]に自ら製作したライブラリ名を追加すれば解決します。

 スタティックライブラリのコンパイルが通っているのに、本番でのリンカーエラーがこれで治まらない場合はいくつか原因が考えられます。1つはライブラリへのパスが通っていない場合です。これは[ツール]→[オプション]から[ディレクトリ]タグを選択し、表示するディレクトリからライブラリファイルを選んで、自分のライブラリのあるフォルダへのパスを通します。他には自分のライブラリを使用するためのライブラリが読み込まれていない場合があります。DirectXを使うときは、本番プログラムでもそれらライブラリを読み込む必要があります。

 これで大方は大丈夫なはずです。


 本番用のクラスと固定的なスタティッククラスを分けることは、オブジェクト指向の心構えとしてもとても大切です。また、実際にクラスをライブラリ化をしてみると、これまで作成してきたクラスが「使いにくい!」と感じてしまうと思います(私はおおいに気づきました)。それは、これまでクラスが内部プロジェクトにあったために、ついついその場しのぎのクラス変更で済ませてしまっていたからです。外部プロジェクトにすると、クラスを組み合わせてプログラムを動かすという意識が途端に芽生えます。これはオブジェクト指向を真に正しく使うためのとても大切な芽生えだと思います。これまでライブラリ化をした事が無い人は是非行ってみて、「使いにくい!」という感覚を経験してみてください。