为设备编译 Boost 1.54 XCode5 - 致命错误:后端错误:符号“___umodsi3”不能在减法表达式中未定义

Posted

技术标签:

【中文标题】为设备编译 Boost 1.54 XCode5 - 致命错误:后端错误:符号“___umodsi3”不能在减法表达式中未定义【英文标题】:Compiling Boost 1.54 XCode5 for device - fatal error: error in backend: symbol '___umodsi3' can not be undefined in a subtraction expression 【发布时间】:2013-10-08 15:56:12 【问题描述】:

我已经能够使用 XCode 5 为 ios 7.0 模拟器成功编译 boost 1.54,但是在尝试为设备编译时出现这个奇怪的 clang 失败:

darwin.compile.c++ bin.v2/libs/atomic/build/darwin-7.0~iphone/release/architecture-arm/link-static/macosx-version-iphone-7.0/target-os-iphone/threading-多/lockpool.o 致命错误:后端错误:符号“___umodsi3”不能在减法表达式中未定义 clang:错误:clang 前端命令失败,退出代码为 70(使用 -v 查看调用) Apple LLVM 5.0 版(clang-500.2.76)(基于 LLVM 3.3svn) 目标:arm-apple-darwin12.5.0 线程模型:posix

这是我的 user-config.jam 设置:

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

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

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

重现的详细步骤:

1. Download and extract the latest sources for boost 1.54
2. Create a user-config.jam in user's home directory (w text above).
3. Run ./bootstrap.sh in the boost directory
4. Run
./b2 toolset=darwin-7.0~iphone architecture=arm target-os=iphone macosx-version=iphone-7.0 threading=multi linkflags=-stdlib=libc++ define=_LITTLE_ENDIAN link=静态安装

这将导致上述错误。

为了比较,在为模拟器编译时使用以下行:

./b2 工具集=darwin-7.0~iphonesim architecture=x86 target-os=iphone macosx-version=iphone-7.0 threading=multi linkflags=-stdlib=libc++ link=static install

这可以正常工作并正确生成用于模拟器的 boost 库。

有人对可能导致这种情况的原因提出建议吗?是clang编译器问题还是我使用的设备编译不正确?我已经能够使用 XCode 4.x 为设备进行编译,之前没有问题...

谢谢! 丹尼尔

【问题讨论】:

你在这方面取得了进展吗?我遇到了同样的错误,还没有找到任何解决方案。只有少数来源再次提到了这一点,例如 llvm.org/bugs/show_bug.cgi?id=10992 或 mail-archive.com/cfe-users@cs.uiuc.edu/msg00402.html 或 answer.techwikihow.com/830119/… 【参考方案1】:

我可能已经找到了答案。使用

<compileflags>-mno-thumb

代替:

<compileflags>-mthumb

现在为我工作。

【讨论】:

以上是关于为设备编译 Boost 1.54 XCode5 - 致命错误:后端错误:符号“___umodsi3”不能在减法表达式中未定义的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu14.04下安装 boost (boost_1.54 最简单的方法)

在 Xcode 5 上使用 Boost - Apple LLVM 5.0

为在 armv7s 上运行的 iOS 设备编译 Boost c++ 库

为 Windows Embedded Compact 7 编译 boost 库

查询与 boost::geometry::index::rtree 的交集

使用 Boost 的 lockfree spsc_queue 时如何编译?