问题 如何在OS X 10.8.4上为iOS模拟器(6.1)编译Boost 1.54.0(1.54)?


我已经成功地编译了几个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 与Boost 1.53.0 使用clang和链接libc ++。

使用Boost编译iOS模拟器时脚本失败 1.54.0 出现以下错误:/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,这就是为什么我甚至尝试这个。


5506
2017-07-18 04:37


起源

我和你在同一条船上,我想知道你或某人是否最终解决了这个问题。据我所知,“-ftemplate-depth-128:command not found”可能是编译器空白替换的结果,如下所示:$ {COMPILER} -ftemplate-depth-128 <other_parameters>这就是为什么该错误使其听起来像ftemplate-depth-128用作命令。 - Aldrich Co
不幸的是,我还没有找到解决方案。我相信编译器命令应该在$ {CONFIG_COMMAND}中设置。对于像这样的实际设备行的iOS构建,出现在调试输出中: toolset.handle-flag-value /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ 一条线后不久说: get .darwin.variable.295 = CONFIG_COMMAND。 - Rotsiser Mho
您使用的是哪个版本的XCode? - Brent
我正在使用Xcode 4.6.3 - Rotsiser Mho


答案:


我通过更改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.sh 使用Boost pkg下载和解压缩。只需要运行并完成所有操作!

Boost 1.54
MacOSx 10.8.4
Xcode 4.6.3

7
2017-09-09 23:08



好的,只是想帮助解决问题: stackoverflow.com/questions/18888327/... 但是我在OSX 10.8下使用Xcode 5 DP6会出现以下错误: boost.sh: line 252: /Users/andy/Applications/Xcode5-DP6.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin//ar: No such file or directory。知道如何解决这个问题吗? - trojanfoe
@trojanfoe我第一次运行boost.sh后遇到了同样的问题。以下似乎对我有帮助(因为我的机器现在忙于构建代码而不是挂在胖子上): cd 至 {generated src dir}/boost_1_54_0/ 跑 ./bootstrap.sh toolset=clang 重新运行 boost.sh - matthias
这是变化的要点。似乎适合我。 gist.github.com/payco/6880661  我现在在标准库中遇到语义问题,但我认为这决定不用c ++ 11编译libc ++头文件。 - matthias
做得好。我扩展了@ matthias的脚本来构建arm64和x86_64。这是要点: gist.github.com/rsobik/7513324 - rsobik
谢谢@rsobik你的脚本与boost 1.55完美配合 - Pascal T.


我不久之前通过读取每个阻塞文件在增强1.53.0和1.54.0之间的差异来解决这个问题,这是一项严肃的任务。我打算发布一个补丁,但只是找到原因需要时间,我没有,现在我不记得它是什么。

无论如何,我记得我过去的快速解决方案,并在截止日期前完成。对于boost 1.54.0,为bjam提供“toolset = darwin- [version] ~iphonesim”参数。你也可以给arm build 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。

此外,仅供参考,为了使ICU检查通过仅针对同样构建ICU库的v7和v7的arm构建,将以下补丁应用于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
   ;

4
2017-08-28 18:46



我有兴趣了解更多。对您发布的b2参数的更改是否会创建类似于提到的脚本的.framework文件? - Aldrich Co
Erik,你的b2参数我无法为架构i386构建,今天刚刚用boost 1.54进行了测试。 - tetuje
tetuje,我建议您在〜/ user-config.jam中使用以下内容进行尝试:(这里空间不够,请查看上面的编辑内容) - Erik Hvatum
Aldrich Co,我的论点没有制定框架。我认为构建框架主要是将所有boost头文件和库放在目录结构中的正确位置并合并库。由于某些单独的.a文件b2创建包含具有相同名称的目标文件,因此合并libs有点棘手;在合并时需要重命名重复项...请注意,上面发布的.sh文件不会执行此操作,如果您需要codecvt,则会出现问题。我最终编写了一个python脚本来解决这个问题。如果你需要它,我会检查我是否可以分享它(我在工作中写的)。 - Erik Hvatum


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

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

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


4
2017-12-23 00:44



谢谢你!但似乎我遇到了一些问题(从bjam输出中提取的命令):g ++ -x assembler-with-cpp -arch armv7 -o make_arm_aapcs_macho_gas.o -c make_arm_aapcs_macho_gas.S以上似乎有效,但是g ++ -x汇编 - 有 - cpp -arch arm64 -o make_arm_aapcs_macho_gas.o -c make_arm_aapcs_macho_gas.S只是不编译:make_arm_aapcs_macho_gas.S:52:18:错误:无效变种'保存'mov a4,a1 @保存上下文堆栈的地址(基本)A4 Any见解? - Dejavu


对于那些有兴趣了解最新情况的人:

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

发布libc ++(c ++ 11),libstdc ++。

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


0
2018-02-03 03:51



我有兴趣跟上框架的最新动态。 - Abandoned Cart