【问题标题】:Build ICU for iOS为 iOS 构建 ICU
【发布时间】:2018-06-16 02:59:33
【问题描述】:

我需要 iPhone 的 ICU 库。我试图从源代码构建它,但是,我得到了这个错误:

   clang++   ...  /Users/petr/Development/icu-cross-compile-master/icu-60-2/source/tools/pkgdata/pkgdata.cpp
/Users/petr/Development/icu-cross-compile-master/icu-60-2/source/tools/pkgdata/pkgdata.cpp:544:18: error: call to unavailable function 'system': not available on iOS
    int result = system(cmd);
                 ^~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.2.sdk/usr/include/stdlib.h:195:6: note: candidate function has been explicitly made unavailable
int      system(const char *) __DARWIN_ALIAS_C(system);

sh ${ICU_SOURCE}/configure --host=arm-apple-darwin --with-cross-build=${PREBUILD_DIR} ${PREFIX}

我的PREFIX 配置如下:

--enable-extras=yes 
--enable-tools=yes 
--enable-icuio=yes 
--enable-strict=no 
--enable-static 
--enable-shared=no 
--enable-tests=yes 
--disable-renaming 
--enable-samples=no 
--enable-dyload=no
--with-data-packaging=static

或者有没有其他方法,如何生成libicudata.a?类似的构建脚本适用于 Android、Mac 和 Win。只有 iPhone 有问题。

【问题讨论】:

  • 你真的需要构建工具吗?它们实际上是一堆命令行工具。如果您在没有工具的情况下构建 ICU,它也可以在无需修补的情况下构建。

标签: c++ ios icu


【解决方案1】:

问题是 system() 在 iOS 11 中已被弃用。

我认为对您的快速解决方法是使用 Xcode 6,而不是 Xcode 9,因此您可以将 iOS 7 作为目标进行编译,其中 system() 未被弃用。

或者,如果您真的需要完全兼容 iOS 的解决方案,您需要重新编写 ICU 源代码以使用 posix spawn 功能而不是 system()。查看此答案以获取更多详细信息:How do you use posix_spawn to replace the deprecated 'system' to launch opendiff in Objective-C?

【讨论】:

  • 谢谢...替换为 posix_spawn 有帮助。
  • 嗨@MartinPerry。你能分享一些关于你替换的细节吗?
  • @Hons 请参阅我的 github:github.com/MartinPerry/icu-build-scripts in build_icu_mac.sh 第 107 行
  • 完美!谢谢!我已将该修复程序集成到我的构建脚本中并且它有效
【解决方案2】:

另一个在 iOS 上成功构建 ICU 作为库的解决方案是在没有工具的情况下使用配置标志 --build-tools=no 进行构建。以下是我用于构建各种平台(包括 android 和 ICU)的完整配置标志集。

    --enable-static=yes
    --enable-shared=no
    --enable-extras=no
    --enable-strict=no
    --enable-icuio=no
    --enable-layout=no
    --enable-layoutex=no
    --enable-tests=no
    --enable-samples=no
    --enable-tools=no
    --enable-dyload=no
    --with-data-packaging=archive

【讨论】:

    【解决方案3】:

    我刚刚制作了一个 makefile,它将下载 ICU 源代码并为 Mac、Catalyst、iOS Simulator 和 iOS 创建一个通用框架。然后可以将其拖放到您的项目中。

    https://github.com/dbquarrel/icu4c-xcframework

    可能会对您有所帮助(尽管晚了很多年)。

    我的用途是在 iOS 的 sqlite 中启用 icu 标记器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2019-12-07
      • 2014-08-16
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多