Windowsのための、GCJのクロスコンパイル環境をlinux上に構築する
GCJでJavaプログラムをコンパイルすることで、 exe単体でJavaのプログラムを配布することができる・・・ ということでクロスコンパイル環境をつくることにしたので、 その環境構築メモです。
GCJ,GCCを使えば、C++からJavaプログラムを使えるので、 過去にJavaで書いた資産をC++で活用することができます。
- http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcj/Invocation.html#Invocation
Vine4.2の用意
最新のGCC,GCJを使うので、ディストリビューションも新しい方がよいだろう ということで、Vine4.2を選択。 (ubuntu8.04も試してみたが、わたしにとっては、Vine4.2の方が少しだけ楽だった)
Vine4.2でのインストールポイントは、
- GMPをaptでインストールしない(ソースから自分で入れる)
- MPFRがaptにない。GMPとセットでソースから自分でインストールする ということです。
事前準備
$ export XMINGW=$HOME/local/xmingw32
$ export XMINGWSRC=$XMINGW/src
binutils
binutilsの入手
http://www.gnu.org/software/binutils/
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz
mingw の runtime , w32api の解凍
ここから、mingw-runtime-3.14.tar.gz,w32api-3.11.tar.gz を入手しておきます。
$ cd ${XMINGW}
$ mkdir mingw32
$ cd mingw32
$ tar xfz ~/src/mingw-runtime-3.14.tar.gz
$ tar xfz ~/src/w32api-3.11.tar.gz
binutils のインストール
$ cd ${XMGWSRC}
$ tar -jxf binutils-2.18.tar.bz2
$ cd binutils-2.18
$ mkdir build
$ cd build
$ ../configure --prefix="${XMINGW}" --target=mingw32 --disable-nls --disable-shared
$ make > make.log
$ make install > make-install.log
gcc,gcj
ソースの入手
事前に以下をダウンロードして ~/src/ 以下に配置しておきます。
- gcc-core-4.3.0.tar.bz2
- gcc-g++-4.3.0.tar.bz2
- gcc-java-4.3.0.tar.bz2
ソースの展開
gccの各ソースアーカイブを ${XMINGWSRC} 以下に展開。
$ cd ${XMINGWSRC}
$ tar jxf ~/src/gcc-core-4.3.0.tar.bz2
$ tar jxf ~/src/gcc-g++-4.3.0.tar.bz2
$ tar jxf ~/src/gcc-java-4.3.0.tar.bz2
configure
$ cd ${XMINGWSRC}/gcc-4.3.0
$ mkdir build
$ cd build
$ ../configure -prefix=${XMINGW} --target=mingw32 \
--enable-languages=c,c++,java \
--disable-shared --enable-static \
--enable-threads=win32 --disable-win32-registry --enable-sjlj-exceptions \
--enable-libgcj \
--without-x --disable-java-awt
※ hostオプションとtargetオプションは同時に使用しないらしい.
以下のエラーが出ました。
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.0+.
GMPとMPFRを用意します。
GMP,MPFRのソースからのインストール
GMP
- http://gmplib.org/
- http://gmplib.org/#DOWNLOAD
gmp-4.2.2.tar.bz2 を入手してインストールします。
$ ./configure --prefix=/usr/local
...
MPFR
- http://www.mpfr.org/
mpfr-2.3.1.tar.bz2を入手してインストールします。
※GMPのインストール場所を明示してインストール。
$ ./configure --prefix=/usr/local --with-gmp=/usr/local
...
再度configure , make , make install
$ cd ${XMINGWSRC}/gcc-4.3.0/build
$ ../configure -prefix=${XMINGW} --target=mingw32 \
--enable-languages=c,c++,java \
--disable-shared --enable-static \
--enable-threads=win32 --disable-win32-registry --enable-sjlj-exceptions \
--enable-libgcj \
--without-x --disable-java-awt
$ make > make.log
$ make install> make-install.log
exeを作成してみる
クロスコンパイル環境を構築したので、実際にうまくいくか、 お約束のHelloWorldでテストしてみます。
Hello.java
public class Hello {
public static void main(String[] s){
System.out.println("Hello MinGW!");
}
}
ecjがインストールされていないとうまくいかないようなメッセージが出る。
$ mingw32-gcj -Wall -o Hello --main=Hello Hello.java
mingw32-gcj: error trying to exec 'ecj1': execvp: No such file or directory
ecj
ecjはeclipseプロジェクト関連のJavaコンパイラのようです。 これが必要なようなのだが、どのようにセットアップすればいいかわからなかった。
javaソースを一旦 class に(jikesやsunのjavac等を使って)してから処理
別のJavaの使える環境で、Hello.javaをHello.classに変換しておきます。
その後、ming32-gcj で exe を生成します。
$ javac Hello.java
$ mingw32-gcj -Wall -o Hello.exe --main=Hello Hello.class
サイズが大きすぎる
Hello.exeはできたが、40Mくらいになる。 それはちょっと大きすぎるんじゃないか。 もう少しコンパクトなexeをつくる方法を探そうと思う。