使用 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 的其他部分,例如 thread
或 filesystem
)。
我试图让 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 将多字节智能引号转换为扩展的 ASCII 智能引号吗?
尝试在 Macintosh 上构建 Ghostscript 9.0.1 时出错