11

我已经成功地编译了几个 Boost 库,并使用以下脚本创建了一个用于 OS X、iOS 和 iOS 模拟器的框架:https ://github.com/wuhao5/boost/blob/188e905626dbd522f65950102ed0c8ce77cb28e8/boost.sh基于 Peter Goodliffe 在此处的工作:http: //goodliffe.blogspot.com/2010/09/building-boost-framework-for-ios-iphone.html使用 clang 并链接到 libc++的 Boost 1.53.0 。

使用 Boost 1.54.0为 iOS 模拟器编译时脚本失败,并出现以下错误:/bin/sh: line 1: -ftemplate-depth-128: command not found.

我做了很多挖掘,这就是我所知道的:

  • 在 boost.sh 中,iOS 模拟器 bjam 和编译器选项包括“-arch i386”
  • Boost 1.54.0 的发行说明指出“Boost 不再支持 80386 目标 CPU”
  • Boost 1.53.0 似乎可以为 OS X、iOS 和 iOS 模拟器使用相同的脚本编译
  • Boost 1.54.0 似乎可以使用相同的脚本为 OS X 和 iOS 本身编译

以下是我认为我知道的:

  • 将“-d13”传递给 bjam(以生成调试信息)时,似乎在为 iOS 模拟器构建时未设置变量“CONFIG_COMMAND”。对于其他配置,此变量设置为 clang 的路径并包括编译器选项。对于模拟器,它是空的,我认为这会导致上述错误,因为当 bjam 尝试使用此变量运行编译器时,它会运行一些以模板深度开头的附加选项。因此,CONFIG_COMMAND 变量似乎没有正确设置,从而导致失败。

我不知道为什么没有设置它,因为我对 Boost 构建系统了解不足,无法筛选它使用“-d13”标志生成的其余 100+MB 输出。我怀疑在 1.54.0 中引入了与“-arch i386”选项不兼容的问题。我尝试将其更改为“-arch i486”和“-arch x86_32”,但出现同样的问题。

有其他人在这方面取得成功吗?我想使用 Boost.Log 这就是我什至尝试这样做的原因。

4

4 回答 4

7

我通过更改 buildBoostForiPhoneOS() 中的行来使用此处给出的 boost.sh 构建它

./bjam -j16 --build-dir=iphonesim-build --stagedir=iphonesim-build/stage --toolset=darwin architecture=x86 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} link=static stage

./bjam -j16 --build-dir=iphonesim-build --stagedir=iphonesim-build/stage --toolset=darwin-${IPHONE_SDKVERSION}~iphonesim architecture=x86 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} link=static stage

使用 Boost pkg 下载和解包修改了 boost.sh 。只需要运行就完成了!

Boost 1.54
MacOSx 10.8.4
Xcode 4.6.3
于 2013-09-09T23:08:03.270 回答
4

不久前,我通过阅读 boost 1.53.0 和 1.54.0 之间每个 jam 文件的差异来解决这个问题,这是一项艰巨的任务。我本来打算发布一个补丁,但只是找到原因花了我没有的时间,现在我不记得它是什么了。

无论如何,我确实记得我过去常常在最后期限前完成的快速解决方案。对于 boost 1.54.0,为 bjam 提供“toolset=darwin-[version]~iphonesim”参数。你也可以给 arm builds toolset=darwin-[version]~iphone,虽然它不需要它。

例如,使用 iOS 6.1 SDK:

./b2 toolset=darwin-6.1~iphonesim architecture=x86 target-os=iphone macosx-version=iphonesim-6.1 link=static variant=debug  define=BOOST_TEST_NO_MAIN define=BOOST_TEST_ALTERNATIVE_INIT_API linkflags="-stdlib=libc++" -j2 -d+2 -sICU_PATH=/usr/local/icu --without-python --layout=tagged --build-dir="/Users/wix/Desktop/boost_1_54_0/_build/simd_build" --stagedir="/Users/wix/Desktop/boost_1_54_0/_build/simd_stage" --debug-configuration stage

如果这对您不起作用,请告诉我,如果我有时间,我会从备份中获取旧的构建目录,看看我是否还有其他事情要做。上面的命令来自我的 histfile。

此外,仅供参考,要使仅针对 v7 和 v7s 且同样构建 ICU 库的 arm 构建通过 ICU 检查,请将以下补丁应用于 tools/build/v2/tools/darwin.jam:

460,464c460,465
<             if $(instruction-set) {
<                 options = -arch$(_)$(instruction-set) ;
<             } else {
<                 options = -arch arm ;
<             }
---
>             #if $(instruction-set) {
>             #    options = -arch$(_)$(instruction-set) ;
>             #} else {
>             #    options = -arch arm ;
>             #}
>       options = -arch armv7 ;

此外,更一般地说,您的 ~/user-config.jam 中可能需要以下内容:

using clang : : : <cxxflags>"-std=c++11 -stdlib=libc++" <linkflags>"-stdlib=libc++" ;

using darwin : 6.1~iphone
   : /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -arch armv7s -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -stdlib=libc++ -miphoneos-version-min=5.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
   : <striper> <root>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
   : <architecture>arm <target-os>iphone
   ;

using darwin : 6.1~iphonesim
   : /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch i386 -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -stdlib=libc++ -miphoneos-version-min=5.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk
   : <striper> <root>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
   : <architecture>x86 <target-os>iphone
   ;

此外,为了为模拟器正确构建 boost::context,我需要将以下内容添加到 libs/context/build/Jamfile.v2:

alias asm_context_sources
   : asm/make_i386_sysv_macho_gas.S
     asm/jump_i386_sysv_macho_gas.S
   : <address-model>32
     <architecture>x86
     <binary-format>mach-o
     <target-os>iphone
     <toolset>darwin
   ;
于 2013-08-28T18:46:23.670 回答
4

根据这篇文章中的回复和其他人创建的脚本,我整理了一个 bash 脚本,该脚本使用 Xcode 5 为 iOS 和 OSX 构建了 boost 框架,这意味着 armv7、armv7s、arm64、i386 和 x86_64。

在这里查看https://github.com/mgrebenets/boost-xcode5-iosx

我确信它会从 1.49.0 开始构建提升

于 2013-12-23T00:44:11.093 回答
0

对于那些有兴趣保持最新的人:

您可以将 BOOST 1.57.0 与 ofxiOSBoost 静态库和头文件一起使用: https ://github.com/danoli3/ofxiOSBoost

libc++ (c++11)、libstdc++ 的版本。

所有构建脚本都在 /scripts 文件夹中(更新的 Peter Goodliffe 脚本)

于 2015-02-03T03:51:03.997 回答