2월 232007
 

GCJ는 Java코드를 컴파일하여 네이티브 실행 코드로 만들 수 있는 GNU진영의 컴파일러입니다.
이게 생각보다 기능이 많아서, Java가 익숙한 사람들은 GCJ로 자바코드를 컴파일을 통하여 실행 파일을 만들 수 있습니다.
일 단 Javac으로 컴파일된 class 파일도 컴파일이 가능하고, Jar로 묶여진 것을 컴파일 할 수도 있고, 심지어는 이렇게 만들어진 object코드를 gcc로 컴파일된 다른 언어의 (C, C++, 등등) object코드와 링크를 해서 실행 파일을 만들 수도 있습니다.

자세한 것은 GCJ 홈페이지를 참조해 주십시요.

아 직 GCJ가 Sun Java 컴파일러의 최신 사항을 반영하지 못하고 있지만, 홈페이지에 의하면, 대부분의 1.4 버젼, 일부 1.5 버젼과 호환가능하다고 되어있습니다. 또한 awt와 swing는 아직 구현되지 않은 구멍이 많이 존재하고 있지만, SWT를 GCJ로 재 컴파일 하여 라이브러리로 만들면, 그 결점도 감출 수 있습니다.

그렇지만 무엇보다 큰 문제는 일반적으로 구할 수 있는 gcj는 윈도우의 경우 정적 라이브러리로만 컴파일되있어, 아무리 작은 프로그램이라도 그 크기가 40~50MB는 우습게 도달하게되고, 거기에 SWT라이브러리 마저 포함되게 되면, 거의 실용적이지 않는 크기의 실행파일이 만들어집니다.
그래서, 이 글에서는 정적 라이브러리인 libgcj.a를 윈도우 환경의 libgcj.dll로 생성하는 방법에 대해 글을 쓸까 합니다.
준비할 것들….

  1. MSYS-1.0.10 – 여기 다운로드
  2. MinGW – 현재 버젼은 gcc 3.5 로 재배포 한 것입니다.
    그래서, gcc-4.2 버젼을 재배포하는 곳이 있습니다. 여기서 다운로드
  3. iconv 라이브러리 – libgcj.a를 재 컴파일 할때 필요합니다. 요 페이지로 가셔서, binary와 developer files를 다 다운 받으십시요. 다운로드 페이지


프로그램 인스톨

  1. MSYS를 C:\에 인스톨하고, 나중에 나온는 후처리 시 MinGW의 설치여부를 묻는 질문에 “y”를 선택하고 그 위치를 “C:/MinGW”로 잡아줍니다.
  2. 다운로드 받은 MinGW-4.2를 C:\MSYS\1.0에다 압축을 풀어줍니다.
    C:\msys\1.0\thisiscool-gcc가 생성되고 그 밑에 gcc가 있습니다.
    C:\msys\1.0\thisiscool-gcc\gcc-4.2 밑에 있는 모든 파일들 bin, lib 등등을 다 C:\MinGW 아래로 복사를 합니다.
    시작 -> 프로그램 -> MinGW -> MSYS -> MSYS 를 실행하고, 커맨드 라인에서 gcc -v 를 입력해서 버젼이 4.2인지 확인합니다.
  3. 다운로드 받은 libiconv-1.9.2-1-bin.zip와 libiconv-1.9.2-1-lib.zip를 C:\MinGW에 풀어 놓습니다.
  4. MSYS를 엽니다.

    cd /
    mkdir libgcj
    cd libgcj
    ar x /c/MinGW/lib/libgcj.a
    find . -name ‘*.o’ > libgcjobjs.list

  5. 위와 같이 실행하면, /libgcj 로 정적라이브러리 libgcj.a에서 object 파일들이 풀려나오고, 그 파일의 목록을 만들어 libgcjobjs.list에 저장됩니다.
  6. 그리고, 아래의 프로그램을 만들고, DummyMain.java라는 이름으로 저장합니다.

    public class DummyMain {
        public static void main(String [] args) {
            return;
        }
    }

  7. 그리고 이를 컴파일 합니다.

    gcj -c DummyMain.java -o DummyMain.o

  8. 다음의 명령은 이제 실제로 libgcj.dll을 만드는 것입니다.

    gcj –main=DummyMain –shared -o libgcj.dll \
    -Wl,–out-implib /c/MinGW/lib/libgcj.a \
    DummyMain.o /c/MinGW/sys-root/mingw/lib/dllcrt2.o \
    -L/c/MinGW/lib \
    -L/thisiscool-gcc/gcc-4.2/i686-pc-mingw32/lib \

    -L/thisiscool-gcc/gcc-4.2/sys-root/mingw/lib \
    -L/thisiscool-gcc/gcc-4.2/lib \
    -L/thisiscool-gcc/gcc-4.2/lib/gcc/i686-pc-mingw32/4.2.0 \
    -Wl,–export-all-symbols -Wl,–enable-runtime-pseudo-reloc \
    -Wl,–allow-multiple-definition `cat libgcjobjs.list` \
    -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -lm -lgdi32 \
    -lws2_32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt \
    -luser32 -lkernel32 -ladvapi32 -lshell32 -liconv

  9. 이 것이 성공적으로 완료되면, 같은 디렉토리에 libgcj.dll 을 찾을 수 있을 것입니다. 용량이 꽤 크네요. 나중에라도 awt나 swing 관련 object파일을 삭제하고 만들면 좀더 용량을 줄일 수 있습니다. 제 노트북이 1.1GHz에 512MB인데, 1.5GB 가상메모리로 약 1시간 20분이 소요되었습니다.
  10. Test를 합니다.

    gcj –main=Test -L. -o Test.exe -lgcj \
    -Wl,–enable-runtime-pseudo-reloc \
    /this
    iscool-gcc/examples/ZeroTest/Test.java

    위와같이 하면, 몇줄의 INFO 출력과 함께, 실행 파일이 만들어집니다. 고작 141KB 정도밖에 차지하지 않습니다.

    $ ./Test.exe
    You have 0 new messages!

GCC에 대해 전문가가 아니라서, 옵션의 내용을 다 아는 것은 아닙니다. 이러저러 시행착오를 거듭하다 성공 했습니다. AWT를 시험 해 봤는데, 실패 했습니다.
앞에서 썼듯이 libgcj.dll을 이용해서 GUI를 만드는 것이 목적이 아니기 때문에 상관은 없습니다. 버그가 있을 지도 모르고, 혹시 GCC의 다른 버젼에서는 안될 수도 있습니다.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)