Index > Windowsのための、GCJのクロスコンパイル環境をlinux上に構築する
Wed, June 18, 2008

Windowsのための、GCJのクロスコンパイル環境をlinux上に構築する

GCJでJavaプログラムをコンパイルすることで、 exe単体でJavaのプログラムを配布することができる・・・ ということでクロスコンパイル環境をつくることにしたので、 その環境構築メモです。

GCJ,GCCを使えば、C++からJavaプログラムを使えるので、 過去にJavaで書いた資産をC++で活用することができます。

Vine4.2の用意

最新のGCC,GCJを使うので、ディストリビューションも新しい方がよいだろう ということで、Vine4.2を選択。 (ubuntu8.04も試してみたが、わたしにとっては、Vine4.2の方が少しだけ楽だった)

Vine4.2でのインストールポイントは、

事前準備

$ 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 の解凍

http://www.mingw.org/

ここから、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の各ソースアーカイブを ${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

gmp-4.2.2.tar.bz2 を入手してインストールします。

$ ./configure --prefix=/usr/local
...

MPFR

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をつくる方法を探そうと思う。

 Twitter
follow me on Twitter
 Categories