Как создать ICU, чтобы я мог использовать его в приложении для iPhone?

Как мне настроить и собрать ICU, чтобы связать его с моим приложением для iPhone?

Я обслуживаю приложение для iPhone, которое использует базу данных SQLite. Теперь мне нужно скомпилировать с включенной поддержкой ICU ( SQLITE_ENABLE_ICU ). У меня есть последний источник ICU.

Я использую флаги конфигурации configure :

./configure --target=arm-apple-darwin --enable-static --disable-shared

После этого запуск gnumake выполняется без ошибок.

Затем я добавляю библиотеки в свой проект Xcode. Но при сборке я получаю 50 строк:

Undefined symbols:
  "_uregex_close_48", referenced from:
      _icuRegexpDelete in libsqlite3-cerod.a(sqlite3_cerod.o)
  "_ubrk_current_48", referenced from:
      _icuNext in libsqlite3-cerod.a(sqlite3_cerod.o)
  "_ucol_strcoll_48", referenced from:
      _icuCollationColl in libsqlite3-cerod.a(sqlite3_cerod.o)
  "_u_isspace_48", referenced from:
      _icuRegexpFunc in libsqlite3-cerod.a(sqlite3_cerod.o)
  "_utf8_countTrailBytes_48", referenced from:
      _utf8_countTrailBytes_48$non_lazy_ptr in libsqlite3-cerod.a(sqlite3_cerod.o)
     (maybe you meant: _utf8_countTrailBytes_48$non_lazy_ptr)
  "_ubrk_next_48", referenced from:
      _icuNext in libsqlite3-cerod.a(sqlite3_cerod.o)

Есть идеи, что я делаю не так?

Отредактировано, чтобы добавить:

Когда я добавляю библиотеки в проект (щелкните правой кнопкой мыши имя проекта , затем Добавить существующую ...), я получаю следующее:

ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicudata.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicui18n.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicuio.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicule.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libiculx.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicutu.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicuuc.a, file was built for unsupported file format which is not the architecture being linked (i386)

Вот почему я думаю, что создаю библиотеку неправильно. Как будто он говорит:

  • Он не может сказать, для какой архитектуры созданы файлы .a
  • libsqlite3-cerod.a построен для i386

Я не понимаю ни одну из возможностей, но я новичок в разработке iPhone.

Отредактировано для добавления

Я попробовал решение @Sergio Moura и получил ошибку, упомянутую в моем комментарии.

Я попробовал решение @ sergio, которое построило. Но я все еще получаю эквивалентные ошибки, начиная с:

ld: warning: in /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicudata.a, file was built for unsupported file format which is not the architecture being linked (i386)

Могу ли я сказать Xcode не то? Я щелкаю правой кнопкой мыши имя проекта, затем выбираю «Добавить-> Существующий файл» и выбираю шесть или семь файлов .a из / icu / iosbuild / lib .Это правильный процесс?

Примечание:

@sergio рекомендует configure --host = arm-apple-darwin , @Sergio Moura использует configure --target = arm- Эппл-Дарвин . Увы, ни то, ни другое не имело значения.

Edit # 2

Выбор устройства (а не эмулятора) решил все, кроме одной, ошибки связи! Вот что осталось:

Undefined symbols for architecture armv6:
  "___sync_synchronize", referenced from:
      _ucol_initUCA_48 in libicui18n.a(ucol_res.ao)
      udata_getHashTable()      in libicuuc.a(udata.ao)
      _umtx_init_48 in libicuuc.a(umutex.ao)
      _initCache in libicuuc.a(uresbund.ao)
      icu_48::hasService()       in libicui18n.a(coll.ao)
      _ucol_initInverseUCA_48 in libicui18n.a(ucol_bld.ao)
      icu_48::locale_set_default_internal(char const*)in libicuuc.a(locid.ao)
      ...
ld: symbol(s) not found for architecture armv6

Этому предшествовал каскад этих предупреждений:

ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated: /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicuuc.a(resbund.ao)
ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated: /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicuuc.a(ustrfmt.ao)

Edit # 3

Предложение @Stephen R. Loomis изменить #define U_HAVE_GCC_ATOMICS с 1 до 0 platform.h ), увы, не имеет значения. Я также понял, что последняя строка ошибки ( не найдена для архитектуры arm6 ) не означала, что она будет работать для arm7 , это было всего лишь напоминанием о том, что это крест - компилировать. Когда я указывал сборку arm7 , она терпела неудачу с теми же сообщениями. Увы.

Редактировать # 4

Успех!

Резюме: флаги сборки @ sergio были в основном правильными. Я добавил -DU_HAVE_GCC_ATOMICS = 0 в CFLAGS сборки ios. Единственное, что я делал неправильно, - это не понимал, что мне нужно кросс-компилировать библиотеку для создания сборки устройства.

Я не пробовал повторить это для симулятора, но это выходит за рамки моего вопроса.

Особая благодарность Стивену Р. Лумису за участие и Серхио Моура за то, что он начал работу.

14
задан 15 revs 21 November 2011 в 20:09
поделиться