Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

はじめてのひき - MacOSX+SDL+D言語でのアプリケーションコンパイル法 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

! MacOSX における D言語で書かれた SDL アプリケーションのコンパイル法

!! 概要

MacOSX & SDL & D 言語でアプリケーションを作成する方法を示す。

!! 事前環境

インストール先として $PREFIX 環境変数が設定されていて、
$PREFIX/bin にパスが通っているものとする。
また、本来の gcc は /usr/bin/gcc にインストールされているものとする。

!! gdc のインストール

現在のディレクトリに gcc-3.3.2.tar.bz2, gdc-0.8.tar.bz2 があるとする。
異なるバージョンを使用する場合は適宜読み変えること。

tar -xvjf gcc-3.3.2.tar.bz2
cd gcc-3.3.2/gcc
tar -xvjf ../../gdc-0.8.tar.bz2
patch -p1 < d/patch-gcc-3.3.x
cd ..
mkdir obj
cd obj
../configure --enable-languages=c,d,c++ --prefix=$PREFIX
make
make install

ここで、 C++ もコンパイルしておいた方が良い。
そうしなければ、 C++ をスタティックリンクすることが難しくなる。

ここで gdc コマンドを発行して gdc: no input files などと言われれば良い。

!! phobos のインストール

前項からディレクトリ移動は無いとする。

mkdir phobos
cd phobos
../../gcc/d/phobos/configure --prefix=$PREFIX
make
make install
make libphobosnm.a
cp libphobosnm.a $PREFIX/lib

これで gdc が使用できるはず。
適当に hello world でもコンパイルして動かしてみると良い。
(現在のバージョン gdc-r1f では libphobosnm.a
コンパイル時にパスを追加しなければならない。
一応パッチを送ったためこの状況は改善されると思われる)

!! SDL のインストール

通常通り、 ./configure; make; make install することになるが、
今後、ダイナミックロードしたいライブラリは
/usr/bin/gcc を用いてコンパイル・リンクしなければならない。

gdc より先にコンパイルしてしまえば問題無いが、
SDL 以外にも gdc より後に入れたいライブラリがある可能性は高いため、
gdc より後にコンパイルする方法をここでは示す。

カレントディレクトリに SDL-1.2.7.tar.gz があるとして、

tar -xvzf SDL-1.2.7.tar.gz
cd SDL-1.2.7
CC=/usr/bin/gcc CXX=/usr/bin/g++ ./configure
make
make install

./configure 時に適宜 --prefix を与えておくこと。

その他のライブラリも SDL に準ずる方法でコンパイルが可能である。

!! アプリケーションのコンパイル

全ての *.d ファイルを gdc でコンパイルする。
またそれにリンクするべき C や C++ などのファイルもコンパイルする。
この時、スタティックリンクするファイルは
全て gdc と一緒にインストールしたもので
コンパイルしなければならないことに注意すること。
(MacOSX 付属の /usr/bin/gcc は使用してはならない)

phobos, SDL ともに main 関数が定義されていて、
横取りする仕様になっているため main に当る部分は
書き替えなければならない。

libphobosnm.a を用い、
libSDLmain.a の main =>
アプリケーション内 SDL_main =>
_d_rtl_start で phobos 起動 =>
D の main が起動
という順序で起動するのが一番自然だと考えられる。

それには、以下のような内容のファイルを作り、
それをリンクすれば良い。

extern (C) int _d_rtl_start(int argc, char* argv[]);
extern (C) int SDL_main(int argc, char* argv[]) {
   return _d_rtl_start(argc, argv);
}

ここまででリンクする準備は整ったため、リンクを行う。
リンクには /usr/bin/gcc を使用して、

/usr/bin/gcc -o app \
-F$HOME/Frameworks -framework SDL -framework Cocoa -framework OpenGL \
$PREFIX/lib/gcc-lib/powerpc-apple-darwin7.3.0/3.3.2/libgcc.a \
$PREFIX/lib/libphobosnm.a \
$PREFIX/lib/libSDLmain.a \
$OBJS

などとする。 $OBJS にはアプリケーションの
全オブジェクトファイルを指定する。
SDL_main を記述したファイルなども忘れないこと。

C++ を使用する場合は $PREFIX/lib/libstdc++.a もリンクすること。
これも、 gdc と同時にインストールしたものを使用しなければならない。

SDL のリンクは、 `sdl-config --libs` でも良いが、
-framework でリンクした方が配布物が作成しやすいと考えられる。

--- shinichiro.h ---