Ошибка j2objc при добавлении гуавы (когда отсутствует.o)

Я играю с j2objc, чтобы посмотреть, смогу ли я использовать гуаву в своем проекте.

Мой проект довольно прост: приложение для одного представления, настроенное для 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];

Попытка скомпилировать приводит к ошибке:

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) 

Похоже, что есть проблема при связывании, нет When.o в libjre_emul.a,

Я попытался запустить следующую строку без каких-либо проблем, просто чтобы убедиться, что javax пакет был там

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

Также проверил, что SAXParser.i в libjre_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];

Я получил ошибку, похожую на ту, с гуавой

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)

После проверки libjre_emul здесь нет 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), но ошибка остается.

В заключение, насколько я знаю, нет способа использовать guava с j2objc, потому что это зависит от пропущенных символов.

Кто-нибудь может доказать, что я не прав, надеюсь? Я действительно хочу начать использовать j2objc в реальном проекте!

Заранее спасибо! Счастливого Рождества!

1 ответ

Решение

Попробуйте создать ссылку в библиотеке jsr305 (-ljsr305), так как она определяет аннотации javax.annotation, упомянутые выше.

Другие вопросы по тегам