gcj, 외부 패키지를 사용하도록 하는 방법에 대해
gcj를 이용해 윈도쪽 프로그램을 만들고 있습니다.
현재 다른 부분은 문제가 없는데, jaxp를 이용하는 프로그램을 작성하면 문제가 생기네요.
# Zeta.exe
Exception in thread "main" java.lang.NoClassDefFoundError: gnu.xml.dom.DomDocume
ntBuilderFactory
at javax.xml.parsers.DocumentBuilderFactory.newInstance(Zeta.exe)
at java.lang.Class.initializeClass(Zeta.exe)
at zetablitz.zeta.ZetaInterpreter.interpretFromXML(Zeta.exe)
at zetablitz.zeta.Zeta.openScript(Zeta.exe)
gnu jaxp 패키지들을 직접 사용하지는 않았지만, gcj의 소스를 보니 javax.xml.* 패키지들 내에
gnu.xml.* 패키지를 사용하도록 하드코딩이 되어 있었습니다. (참고로 javax.xml 패키지를
사용하는 라이브러리 역시 제가 작성한 게 아니라 써드파티라, 소스를 수정하자면 일이
커집니다.)
그래서 classpath 소스에서 직접 DomDocumentBuilderFactory를 컴파일해다 링크하려고 했는데,
이번에는 이미 존재하는 클래스라고 에러 메시지가 뜹니다.
# gcj --main=zetablitz.zeta.Zeta lib\*.o DomDocumentBuilderFactory.o -s -o Zeta
/home/trudemar/Desktop/compile-win-win/gcc-build/i686-pc-mingw32/libjava/gnu/xml
/dom/DomDocumentBuilderFactory.java:69: multiple definition of `gnu::xml::dom::D
omDocumentBuilderFactory::DomDocumentBuilderFactory()'
처음엔 제가 사용하는 mingw/gcj 패키지의 문제인가 싶었는데, 검색해 보니 저와 완전히 같은 문제를
겪는 사람이 gcj 메일링에 글을 올렸었더군요. 하지만 답변이 없었습니다.
지금 가장 쉬운 해결책은 gcj에서 직접 컴파일한 classpath 패키지들을 이용하도록 하는 것이라는
생각이 드는데, 제대로 해결하고 있는 건지 잘 모르겠습니다. 일단 gcj의 옵션중에
기존 패키지 네임스페이스를 덮어 쓸 방법이 있는지 궁금합니다. 사용하는 gcj 버전은 4.2.0 입니다.
답변 부탁드립니다.
해결했습니다.
해결했습니다. -Wl,--allow-multiple-definition 옵션이 있네요.
DomDocumentBuilderFactory 하나 덮어씌워주니 잘 실행 됩니다. 하하핫...
댓글 달기