2014-12-24 2 views
1

프로젝트에서 구아바를 사용할 수 있는지 확인하기 위해 j2objc를 사용하고 있습니다.guava (When.o가 없습니다.)를 추가하는 중 오류가 발생했습니다.

내 프로젝트는 매우 간단합니다 :

Undefined symbols for architecture x86_64: 
    "_JavaxAnnotationMetaWhenEnum_initialized", referenced from: 
     +[ComGoogleCommonBaseCharMatcher __annotations_removeFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_retainFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withChar_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimLeadingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimTrailingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     ... 
    "_JavaxAnnotationMetaWhenEnum_values_", referenced from: 
     +[ComGoogleCommonBaseCharMatcher __annotations_removeFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_retainFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withChar_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimLeadingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     +[ComGoogleCommonBaseCharMatcher __annotations_trimTrailingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o) 
     ... 
    "_OBJC_CLASS_$_JavaxAnnotationCheckForNull", referenced from: 
     objc-class-ref in libguava.a(Ints.o) 
     objc-class-ref in libguava.a(AndroidInteger.o) 
    "_OBJC_CLASS_$_JavaxAnnotationCheckReturnValue", referenced from: 
     objc-class-ref in libguava.a(CharMatcher.o) 
     objc-class-ref in libguava.a(Joiner.o) 
     objc-class-ref in libguava.a(Splitter.o) 
     objc-class-ref in libguava.a(CacheBuilder.o) 
     objc-class-ref in libguava.a(BaseEncoding.o) 
     objc-class-ref in libguava.a(UnsignedLong.o) 
     objc-class-ref in libguava.a(UnsignedInteger.o) 
     ... 
    "_OBJC_CLASS_$_JavaxAnnotationMetaWhenEnum", referenced from: 
     objc-class-ref in libguava.a(CharMatcher.o) 
     objc-class-ref in libguava.a(Joiner.o) 
     objc-class-ref in libguava.a(Splitter.o) 
     objc-class-ref in libguava.a(CacheBuilder.o) 
     objc-class-ref in libguava.a(BaseEncoding.o) 
     objc-class-ref in libguava.a(UnsignedLong.o) 
     objc-class-ref in libguava.a(UnsignedInteger.o) 
     ... 
    "_OBJC_CLASS_$_JavaxAnnotationNullable", referenced from: 
     objc-class-ref in libguava.a(Equivalence.o) 
     objc-class-ref in libguava.a(FunctionalEquivalence.o) 
     objc-class-ref in libguava.a(Functions.o) 
     objc-class-ref in libguava.a(Joiner.o) 
     objc-class-ref in libguava.a(Objects.o) 
     objc-class-ref in libguava.a(Optional.o) 
     objc-class-ref in libguava.a(PairwiseEquivalence.o) 
     ... 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

: 사용자 정의 라인 j2obcj (https://github.com/google/j2objc/wiki/Xcode-Build-Rules)에 대해 구성된 단일보기 응용 프로그램을 컴파일하려고 appDelegete.m

#include "java/util/ArrayList.h" 
#include "com/google/common/collect/Lists.h" 
[...] 
[ComGoogleCommonCollectLists newArrayList]; 

에 추가 오류가 발생합니다 연결하는 동안 문제가있는 것 같습니다. When.o은 에 없습니다.

난 그냥 javax 패키지

#include "javax/xml/parsers/SAXParser.h" 
[...] 
[[JavaxXmlParsersSAXParser alloc] init]; 

는 또한 SAXParser.ilibjre_emul

$ otool -o lib/libjre_emul.a | grep .o\): | grep SAXParser 
lib/libjre_emul.a(SAXParser.o): 
lib/libjre_emul.a(SAXParserFactory.o): 
lib/libjre_emul.a(SAXParserFactoryImpl.o): 
lib/libjre_emul.a(SAXParserImpl.o): 

에 그러나 경우에 있음이 확인 것을 확인, 문제없이 다음 줄을 실행하려고했습니다 시도 중 When

#include "javax/annotation/meta/When.h" 
[...] 
[JavaxAnnotationMetaWhenEnum values]; 

나는이 libjre_emul을 확인한 후 구아바

Undefined symbols for architecture x86_64: 
    "_OBJC_CLASS_$_JavaxAnnotationMetaWhenEnum", referenced from: 
     objc-class-ref in AppDelegate.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

과 유사한 오류가있어 더 When.o

otool -o lib/libjre_emul.a | grep .o\): | grep When 

내 설정은 없습니다 : 나는 다른 버전을 시도했습니다

J2OBJC_HOME = ./bin/j2objc-0.9.5; 
HEADER_SEARCH_PATHS = $(inherited) "${J2OBJC_HOME}/include"; 
LIBRARY_SEARCH_PATHS = $(inherited) "${J2OBJC_HOME}/lib"; 
OTHER_LDFLAGS = $(inherited) -l"z" -l"jre_emul" -l"guava" -l"icucore" -framework "Security" -ObjC; 

(0.9.5, 0.9.4, 0.9.3, 0.9) 오류가 남아 있습니다.

필자가 알고있는 한, 누락 된 기호에 의존하기 때문에 j2objc와 함께 구아노를 사용할 방법이 없다는 것을 알고 있습니다.

누구나 나를 잘못 증명할 수 있습니까? 실제 프로젝트에서 j2objc를 사용하기를 정말로 원합니다!

미리 감사드립니다. 메리 크리스마스!

답변

4

위에서 언급 한 javax.annotation 주석을 정의하므로 jsr305 라이브러리 (-ljsr305)에서 연결을 시도해보십시오.

+0

마지막으로 작동합니다! 정말 감사합니다! :) – 7ynk3r

+0

'OTHER_LDFLAGS' 가능한 모든 값이있는 참조가 있습니까? – 7ynk3r

+0

j2objc로 배포 된 모든 라이브러리는 dist/lib에 있습니다. 네이티브 라이브러리에는 lib .a라는 이름 지정 패턴이 있으므로 jjr305.jar, guava-jdk5.jar, junit.jar 파일도 dist에 해당하는 libjsr305.a, libguava.a, libjunit.a 등이 있습니다./lib. – tball