Как мне настроить и собрать 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)
Вот почему я думаю, что создаю библиотеку неправильно. Как будто он говорит:
Я не понимаю ни одну из возможностей, но я новичок в разработке 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. Единственное, что я делал неправильно, - это не понимал, что мне нужно кросс-компилировать библиотеку для создания сборки устройства.
Я не пробовал повторить это для симулятора, но это выходит за рамки моего вопроса.
Особая благодарность Стивену Р. Лумису за участие и Серхио Моура за то, что он начал работу.