GCJ

coLinuxGCJ を入れてみた。
Javaなのにネイティブコードを吐いてくれるらしい。


試しにHelloWorldを動かしてみる。

public class Test {
  public static void main(String[] args) {
    System.out.println("Hello, world!!");
  }
}

こんぱいるー、が通らない。

$ gcj Test.java
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld returned 1 exit status


どのクラスのmainかを教えてやる必要があるらしい。

$ gcj --main=Test Test.java && ./a.out
Hello, world!!
  • --main オプションは、実行ファイル生成時に必要。
  • 複数ファイルの分割コンパイルは、(gccによる)C言語コンパイルと同じような感じでできる。
  • すなわち、必要なソースファイルかそのオブジェクトファイル(-c オプションで作れる) をリンク時に全てgcjの引数として渡す。
  • ファイルさえ直接コンパイラに渡してやれば、Javaのパッケージに従ったディレクトリ構造に従う必要がない。