【发布时间】:2011-12-28 21:36:36
【问题描述】:
如何配置和构建 ICU,以便将其链接到我的 iPhone 应用?
我正在维护一个使用 SQLite 数据库的 iPhone 应用程序。现在我必须在启用 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 错误的事情吗?我右键单击项目名称,然后选择“添加->现有文件”,然后从/icu/iosbuild/lib 中选择六个或七个.a 文件。这是正确的流程吗?
注意:
@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
@Stephen R. Loomis 建议我将 #define U_HAVE_GCC_ATOMICS 从 1 更改为 0(在 platform.h 中)没有任何区别,唉。我还意识到错误的最后一行 (not found for architecture arm6) 并不意味着它适用于arm7,这只是一个交叉编译。当我指定 arm7 构建时,它失败并显示相同的消息。唉。
编辑#4
成功了!
总结:@sergio 的构建标志基本上是正确的。我在 ios 构建的 CFLAGS 中添加了 -DU_HAVE_GCC_ATOMICS=0。我做错的一件事是没有意识到我需要交叉编译库来创建设备版本。
我没有尝试对模拟器重复此操作,但这超出了我的问题范围。
特别感谢 Steven R. Loomis 的参与,以及 Sergio Moura 的推动。
【问题讨论】:
-
你在 ICU 静态库中链接吗?
-
Eric,Apple 在这个解决方案上有什么问题吗?
-
Apple 没有问题,我们在 12 月发货,没有出现任何问题。