シューティングゲームツクールを作ろう(基本編)

開発方法

大規模なプログラム開発では、デバッグの容易さやコンパイル時間の短縮のために、
プログラムの要素毎にファイルを作成し、それぞれ分割コンパイルを行い、最後に結合します。
また、頻繁に使用する関数等は共有ライブラリとしてまとめ、
複数のアプリケーションプログラムから呼び出して使用します。
さらに、コンパイルする際に一々コマンドを入力するのは面倒なので、
makeによってコンパイルを自動化します。

以下では、大規模なプログラム開発で常識的に行われている以上の3点について解説します。
(例ではコンパイルのためにgccを使っていますが、
gamelibではodeを使用する関係でC++のコンパイラが必要なため、g++を用いてコンパイルしています。)

分割コンパイル

一つのアプリケーションプログラムを開発するために複数のファイルでプログラムソースを管理し、
それぞれを別々にコンパイルして、最後に結合します。

以下の.cファイルがあるとします。

main.c
func.c

以上のファイルの中にはただ一つmain関数があるものとします。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。

$ gcc -c main.c
$ gcc -c func.c
$ ls
main.o func.o

"gcc -c"により.oファイルが生成されました。 最後に以下のように実行ファイルを生成します。

$ gcc -o test_func main.o func.o

ただし、"-o"オプションは実行ファイルの名前を指定しています。

共有ライブラリ開発

ライブラリを用意する事、はアプリケーションプログラムで頻繁に使用する関数等をあらかじめ開発して、
アプリケーション開発時に何度も同じプログラムを開発する手間を省いたり、
予め十分に構造を設計しておく事でバグの発生を防ぐ狙いがあります。
試しに普段使用しているコンピュータで使われている共有ライブラリを以下のコマンドで見てみましょう。

$ ls /usr/lib
$ ls /usr/local/lib

アプリケーションプログラム開発時には、そのライブラリの思想を十分汲み取る事で、
効率の良いプログラム開発ができ、アプリケーションプログラムのアイディア実現に集中する事ができます。

MacOS Xの場合、共有ライブラリのファイルは"lib"で始まり.dylibで終わる事になっており
今回はlibfunc.dylibを作成するものとします。
まず、以下の.cファイルがあるとします。

func1.c
func2.c

以上のファイルの中にはmain関数があってはいけません。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。

$ gcc -c func1.c
$ gcc -c func2.c
$ ls
main.o func.o

"gcc -c"により.oファイルが生成されました。 最後に以下のように共有ファイルを作成します。

$ gcc -dynamiclib -o libfunc.dylib func1.o func2.o
$ ls
func1.c func1.o func2.c func2.o libfunc.dylib

ただし、"-o"オプションは共有ファイルの名前を指定している。

linuxの場合、共有ライブラリのファイルは"lib"で始まり.soで終わる事になっており、
今回はlibfunc.soを作成するものとします。
まず、以下の.cファイルがあるとします。

func1.c
func2.c

以上のファイルの中にはmain関数があってはいけません。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。

$ gcc -c func1.c
$ gcc -c func2.c
$ ls
main.o func.o

"gcc -c"により.oファイルが生成されました。 最後に以下のように共有ファイルを作成します。

$ gcc -shared -o libfunc.so func1.o func2.o
$ ls
func1.c func1.o func2.c func2.o libfunc.so

ただし、"-o"オプションは共有ファイルの名前を指定しています。

共有ライブラリの使用方法

共有ライブラリを使用するためにはコンパイラにオプションを渡す必要があります。

gcc -L../lib -lfunc -o test_func main.c
-L: ライブラリの場所を指定するオプション
-l: リンクするライブラリを指定するオプション。ライブラリのファイル名はlib??.so (linux等)、lib??.dylib (MacOS X)のようになっているが、??の部分のみ記述します。

本ライブラリでは"/usr/local/lib"等、通常システム用のディレクトリにインストールされるライブラリが
ユーザ領域にインストールされる設計になっています。
これは演習室の環境がユーザにシステム領域へのアクセスを禁じているためで、
LD_LIBRARY_PATH(MacOS Xの場合はDYLD_LIBRARY_PATH)を実行環境に合わせて設定し直す必要があります。

そのため以下のような記述をexec.shに自動的に書き込むようにスクリプトを作っていますので、
exec.shを通して完成したプログラムを実行する事ができます。

$cat exec.sh
#!/bin/sh
export DYLD_LIBRARY_PATH="../../lib" #MacOS X用の記述
export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH
$* # スクリプトの引数を全て展開
$ ./exec.sh ./shoothing_game

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS