我正在为其他 iOS 开发人员开发一个框架,并且我使用 boost 作为依赖项。我正在创建一个包含 arm6、arm7、arm7s、arm64、i386 和 x86_64 的库(fat 库)的 boost.framework。编译和链接似乎工作正常,但在模拟器中使用我的库和 XCode 5.0.2 中的 boost.framework 会导致以下错误
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
pthread_cond_init$UNIX2003 called from function _ZN5boost18condition_variableC2Ev
但是,在设备上部署应用程序不会产生任何问题。
环顾四周后,我发现了一个 StackOverflow entry解释说他的 $UNIX2003
函数名是 OSX 库的一部分。基于此,我检查了库的链接,只有库的 i386 部分链接到 $UNIX2003
部分(符合 Apple's own description )。 arm* 架构使用的是无后缀版本。
我的问题是,我该怎么做才能让它在模拟器上运行?我需要使用特定标志重新编译 boost 吗?是否可以选择告诉模拟器闭嘴?或者至少我有办法告诉模拟器使用实际的设备库而不是 i386 的吗?
有可能自己编写这些 $UNIX2003
函数,然后委托(delegate)给真正的函数。但由于有相当多的函数调用,我宁愿不这样做,特别是因为使用我的框架的开发人员需要做同样的事情,我猜(我想避免)。
最佳答案
遇到a discussion on an unrelated mailing list之后,我找到了最初的罪魁祸首:boost 库是针对 Mac OS X 版本(我猜是 libc++)构建的,而不是针对它的 iPhone 模拟器版本构建的。解决这个问题会以正确的格式生成框架,并且只包含指向正确版本的系统调用的链接。
关于c++ - 在 iOS 模拟器 : Linking with Unix Conformance Layer 中使用库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857600/