Как настроить и настроить 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
, это было всего лишь fyi, что это было кросс-компиляция. Когда я указал конструкцию arm7
, она не с теми же сообщениями. Увы.
Изменить # 4
Успех!
Сводка: флаги сборки @sergio были в основном правильными. Я добавил -DU_HAVE_GCC_ATOMICS = 0 в iOS build CFLAGS. Единственное, что я делал неправильно, не понимал, что мне нужно перекрестно скомпилировать библиотеку для создания сборки устройства.
Я не пытался повторить это для симулятора, но это выходит за рамки моего вопроса.
Особая благодарность Стивену Лумису за подачу, а также Серхио Муре за то, что он начал кататься.