使用 iconv 为 iOS 构建 Boost.Locale

Posted

技术标签:

【中文标题】使用 iconv 为 iOS 构建 Boost.Locale【英文标题】:Build Boost.Locale with iconv for iOS 【发布时间】:2015-10-29 11:30:01 【问题描述】:

我目前正在尝试为 ios 构建 Boost.Locale,但我无法找到 iconv 库(我正在为 iOS 成功构建 Boost 的其他部分,例如 threadfilesystem )。

我试图让 Boost.Build 自己找到它,我试图将 ICONV_PATH 变量设置为指向 iPhoneOS SDK iconv 库。检查 Boost.Locale 中的 Jamfile,我偶然发现了这条规则:

lib iconv 
  : 
  : <search>$(ICONV_PATH)/lib <link>shared <runtime-link>shared
  :
  : <include>$(ICONV_PATH)/include 
  ;

所以我认为将-sICONV_PATH 设置为/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr 就足够了,因为该目录包含一个lib 和一个include 文件夹,其中包含iconv 库和标头,但Boost 仍然无法找到它并吐出:

iconv (libc)             : no
iconv (separate)         : no
icu                      : no
icu (lib64)              : no
Boost.Locale needs either iconv or ICU library to be built.

请注意,我总是使用--reconfigure 选项调用b2,因此它不是缓存先前调用的结果(在上面的列表中将有一个尾随(cached)

那么,有没有办法正确地将 Boost 指向 iOS SDK 中的 iconv 实现?如果可能,我想避免构建单独的 iconv。

【问题讨论】:

【参考方案1】:

我遇到了类似的问题。经过一些挖掘和一些红鲱鱼后,我了解到 boost 通过编译 has_iconv.cpp 程序来检测 iconv。在我的情况下(使用许多人似乎用于编译 iOS 的 boost.sh 脚本)在 config.log 中有很多编译错误是由于 user-config.jam 中的 using-syntax 不正确引起的。所以问题 - 至少对我来说 - 不是设置 ICONV_PATH 而是让检测程序编译!也许你也有类似的问题。

如果你有兴趣,我做了一个full write up of finding in my blog。

【讨论】:

【参考方案2】:

构建时应该会收到以下日志输出

如果在 Darwin/Mac OS X 构建中找不到 iconv 库,请确保 没有多个 iconv 安装并提供 -sICONV_PATH 构建选项以指向 iconv 库的正确位置。

首先您需要引导位置,其中 $ICU = ICU 根目录构建 ICU 构建产品所在的目录(“bin/”、“include/”等) :

.\bootstrap --with-icu=$ICU

然后

.\b2 boost.locale.icu=on boost.locale.std=off -sICU_PATH="$ICU" --with-chrono --with-locale --with-system --with-thread link=static stage cxxflags="-miphoneos-version-min=9.0 -stdlib=libc++"

【讨论】:

你的意思是iconv而不是ICU?我正在尝试专门用 iconv 构建它(是的,我收到了那个警告,正如我的帖子提到的,我指定了sICONV_PATH)。【参考方案3】:

迟到的答案,但这是一个使用 iconv 库 (boost v1_64_0) 在 iOS 上支持 Boost.Locale 的工作配置。 https://github.com/Cogosense/iOSBoostFramework 提供了一个实现,它使用 Makefile 为 armv7、armv7s、arm64、i386 和 x86_64 架构构建 boost 框架。

要构建 32 位 ARM,请创建具有以下内容的 user-config.jam

using clang-darwin : arm                                                                                                                                                  
    : xcrun --sdk iphoneos clang++
    : <cxxflags>"-miphoneos-version-min=8.0  -arch armv7s -DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++ -std=c++11 -D_LITTLE_ENDIAN -Wall -pedantic -Wno-unused-variable"
      <linkflags>"-arch armv7s"
      <striper>
    ;

架构也可以设置为armv7,cxxflags的值随自己的喜好改变,但是-arch标志是必须的。

使用以下构建命令为 32 位 iPhone 目标构建 boost:

BOOST_BUILD_USER_CONFIG=<path-to-arm32-jam-config>/user-config.jam \
SDK_PATH=$(xcrun --sdk iphoneos --show-sdk-platform-path) \
./b2 -sICONV_PATH=$SDK_PATH/Developer/SDKs/iPhoneOS.sdk/usr \
    toolset=clang-darwin-arm \
    target-os=iphone

要构建 64 位 ARM,请创建具有以下内容的 user-config.jam

using clang-darwin : arm64                                                                                                                                                  
    : xcrun --sdk iphoneos clang++
    : <cxxflags>"-miphoneos-version-min=8.0  -arch arm64 -DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++ -std=c++11 -D_LITTLE_ENDIAN -Wall -pedantic -Wno-unused-variable"
      <linkflags>"-arch arm64"
      <striper>
    ;

使用以下构建命令为 64 位 iPhone 目标构建提升:

BOOST_BUILD_USER_CONFIG=<path-to-arm64-jam-config>/user-config.jam \
SDK_PATH=$(xcrun --sdk iphoneos --show-sdk-platform-path) \
./b2 -sICONV_PATH=$SDK_PATH/Developer/SDKs/iPhoneOS.sdk/usr \
    toolset=clang-darwin-arm64 \
    target-os=iphone

要构建 32 位 x86 模拟器,请创建具有以下内容的 user-config.jam

using clang-darwin : x86                                                                                                                                                  
    : xcrun --sdk iphonesimulator clang++
    : <cxxflags>"-miphoneos-version-min=8.0  -arch i386 -DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++ -std=c++11  -Wall -pedantic -Wno-unused-variable"
      <linkflags>"-arch i386"
      <striper>
    ; 

使用以下构建命令为 32 位 iPhone 模拟器构建提升:

BOOST_BUILD_USER_CONFIG=<path-to-x86-jam-config>/user-config.jam \
SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-platform-path)
./b2 -sICONV_PATH=$SDK_PATH/Developer/SDKs/iPhoneSimulator.sdk/usr \
    toolset=clang-darwin-i386 \
    target-os=iphone

要构建 64 位 x86 模拟器,请创建具有以下内容的 user-config.jam

using clang-darwin : x86_64                                                                                                                                                 
    : xcrun --sdk iphonesimulator clang++
    : <cxxflags>"-miphoneos-version-min=8.0  -arch x86_64 -DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -stdlib=libc++ -std=c++11  -Wall -pedantic -Wno-unused-variable"
      <linkflags>"-arch x86_64"
      <striper>
    ; 

使用以下构建命令为 64 位 iPhone 模拟器构建提升:

BOOST_BUILD_USER_CONFIG=<path-to-x86_64-jam-config>/user-config.jam \
SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-platform-path)
./b2 -sICONV_PATH=$SDK_PATH/Developer/SDKs/iPhoneSimulator.sdk/usr \
    toolset=clang-darwin-x86_64 \
    target-os=iphone

【讨论】:

我尝试在 Boost 1.74.0 上执行此操作 - 失败了。没有什么对我有用。现在尝试将其用于 1.64.0。稍后回复。 @AlexandrKirilov 在此答案中链接的 GitHub 存储库中,有一个 1_73_0_dev 分支,其中包含用于提升 1.73 的补丁 - 它正在工作。我希望相同的路径适用于 1.74。

以上是关于使用 iconv 为 iOS 构建 Boost.Locale的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx中使用iconv转码(win32,iOS,Android)

iconv 任何编码为 UTF-8

我可以使用 iconv 将多字节智能引号转换为扩展的 ASCII 智能引号吗?

尝试在 Macintosh 上构建 Ghostscript 9.0.1 时出错

强制从 US-ASCII 编码为 UTF-8 (iconv)

iconv 中的输出缓冲区为空,同时从 ISO-8859-1 转换为 UTF-8