- 追加された行はこの色です。
- 削除された行はこの色です。
[[シューティングゲームツクールを作ろう(基本編)]]
* 開発方法 [#sa09ce3d]
大規模なプログラム開発では、デバッグの容易さやコンパイル時間の短縮のために、
~
プログラムの要素毎にファイルを作成し、それぞれ分割コンパイルを行い、最後に結合します。
~
また、頻繁に使用する関数等は共有ライブラリとしてまとめ、
~
複数のアプリケーションプログラムから呼び出して使用します。
~
さらに、コンパイルする際に一々コマンドを入力するのは面倒なので、
~
makeによってコンパイルを自動化します。
以下では、大規模なプログラム開発で常識的に行われている以上の3点について解説します。~
(例ではコンパイルのためにgccを使っていますが、
~
gamelibではodeを使用する関係でC++のコンパイラが必要なため、g++を用いてコンパイルしています。)
**分割コンパイル [#uc776c7f]
一つのアプリケーションプログラムを開発するために複数のファイルでプログラムソースを管理し、~
それぞれを別々にコンパイルして、最後に結合します。
~
- 分割コンパイル例
以下の.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"オプションは実行ファイルの名前を指定しています。
** 共有ライブラリ開発 [#se80496f]
ライブラリを用意する事、はアプリケーションプログラムで頻繁に使用する関数等をあらかじめ開発して、
~
アプリケーション開発時に何度も同じプログラムを開発する手間を省いたり、
~
予め十分に構造を設計しておく事でバグの発生を防ぐ狙いがあります。
~
試しに普段使用しているコンピュータで使われている共有ライブラリを以下のコマンドで見てみましょう。
$ ls /usr/lib
$ ls /usr/local/lib
アプリケーションプログラム開発時には、そのライブラリの思想を十分汲み取る事で、
~
効率の良いプログラム開発ができ、アプリケーションプログラムのアイディア実現に集中する事ができます。
- MacOS Xの例
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の例
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"オプションは共有ファイルの名前を指定しています。
** 共有ライブラリの使用方法 [#l5ca86a5]
共有ライブラリを使用するためにはコンパイラにオプションを渡す必要があります。
gcc -L../lib -lfunc -o test_func main.c
-L: ライブラリの場所を指定するオプション
-l: リンクするライブラリを指定するオプション。ライブラリのファイル名はlib??.so (linux等)、lib??.dylib (MacOS X)のようになっているが、??の部分のみ記述します。
-実行する際の注意点(linuxの場合)
ライブラリはldconfigで指定された場所か、
~
環境変数LD_LIBRARY_PATHで指定された場所を探すため、
~
適切に設定する必要があります。
本ライブラリでは"/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