使用iOS版的iconv构建Boost.Locare

Build Boost.Locale with iconv for iOS

本文关键字:Boost Locare 构建 iconv iOS 版的 使用      更新时间:2023-10-16

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

我试着让Boost.Build自己找到它,我试着将ICONV_PATH变量设置为指向iPhoneOSDK图标库。在Boost.Locare中检查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和一个包含iconv-lib和标头的include文件夹,但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实现?如果可能的话,我想避免建立一个单独的图标。

我也遇到过类似的问题。经过一番挖掘和研究,我了解到boost通过编译has_iconv.cpp程序来检测iconv。在我的案例中(使用很多人似乎用来为iOS编译的boost.sh脚本),config.log中有很多编译错误是由user-config.jam中的错误使用语法引起的。所以问题——至少对我来说——不是设置了ICONV_PATH,而是让检测程序编译!也许你也有类似的问题。

如果你感兴趣的话,我在博客上写了一篇完整的文章。

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

如果在Darwin/Mac OS X构建中找不到iconv库,请确保没有多个iconv安装,并提供-sICONV_PATHbuild选项指向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库(Boost v1_64_0)在iOS上支持Boost.Locare的工作配置。实现可从https://github.com/Cogosense/iOSBoostFramework它使用Makefile为armv7、armv7s、arm64、i386和x8_64体系结构构建一个boost框架。

要构建32位ARM,请创建一个用户配置果酱,内容如下:

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,请创建包含以下内容的用户配置果酱

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:

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模拟器,请创建一个用户配置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:

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模拟器,请创建一个用户配置果酱,内容如下:

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:

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