Как настроить и построить 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-apple-darwin
. Увы, ничего не изменилось.
Редактировать # 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)
Редактировать # 3
@ Предложение Стивена Р. Лумиса о том, чтобы я сменил #define U_HAVE_GCC_ATOMICS
с 1
на 0
(в platform.h
), увы, не имело значения. Я также понял, что последняя строка ошибки (not found for architecture arm6
) не означает, что она будет работать для arm7
, это была только к сведению, что это была кросс-компиляция. Когда я указал сборку arm7
, она не удалась с теми же сообщениями. Увы.
Редактировать # 4
Успех!
Резюме: флаги сборки @ sergio были по существу правильными. Я добавил -DU_HAVE_GCC_ATOMICS = 0 в CFLAGS сборки ios. Единственное, что я делал неправильно, это не осознавал, что мне нужно было кросс-компилировать библиотеку для создания сборки устройства.
Я не пытался повторить это для симулятора, но это выходит за рамки моего вопроса.
Особая благодарность Стивену Р. Лумису за подачу и Серхио Моуре за то, что все началось.