libstdc++适配Xcode10与iOS12

Posted Cocoa开发者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libstdc++适配Xcode10与iOS12相关的知识,希望对你有一定的参考价值。

编译报错



当你开心地升级完新macOS,以及新XCode,准备体验了一把 Dark Mode 编程模式,开心的打开自己的老项目的时候,发现编译不通过了╮(╯_╰)╭


如果你的工程中如果依赖libstdc++,无论是你本身的功能用 C++ 跨平台编写,还是你引入了某个SDK其内部依赖这个libstdc++,都会导致整个工程编译不通过,报出Undefined symbols,C++ 的 List 找不到了


libstdc++适配Xcode10与iOS12


原因是苹果在XCode10和ios12中移除了libstdc++这个库,由libc++这个库取而代之,苹果的解释是libstdc++已经标记为废弃有5年了,建议大家使用经过了llvm优化过并且全面支持C++11的libc++库。


临时解决办法


  • 编译问题


拷贝缺失的libstdc++


XCode10目前是Beta版,和XCode9正式版可以共存,于是从XCode9的目录里,把缺失的.tbd文件拷贝过来,要记得拷贝2套,一套是模拟器的,一套是设备的,可以简单的用下面的命令


cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/


libstdc++适配Xcode10与iOS12


拷贝过去后,你就可以在新XCode(黑暗模式真心舒服)下面看到libstdc++了,放心的添加到工程里吧


  • 模拟器运行



拷贝libstdc++之后就可以编译通过了,但App在模拟器里一运行就崩溃,就会报动态链接库装载出错,看出错提示说是.dylib与这个模拟器不符合。奇怪的是同样的工程用XCode9编译运行就一点问题也没有,初步怀疑是XCode10自带的iOS12模拟器的问题,在XCode10中安装iOS11的模拟器运行环境,然后切换到iOS11模拟器运行,一切问题没有。(凑合一下在XCode里调试的时候用iOS11模拟器吧,忍忍)


  • 真机运行


拷贝libstdc++之后,使用iOS12的真机运行,没有啥太大的问题


正确解决办法


  • 如果你自己的业务模块使用了libstdc++,那么就把模块代码重新调整为依赖libc++,然后重新检查是否存在问题,重新编译

  • 如果你引用的三方库使用了libstdc++,那么向三方库寻求支持,进行升级


libc++


Apple 为什么在 Mavericks 里把 C++ 标准库 libstdc++ 改成 libc++?


其他关于此问题的讨论



相关推荐:




以上是关于libstdc++适配Xcode10与iOS12的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10 (iOS 12) 不包含 libstdc++6.0.9

iOS开发 Xcode10报错缺少libstdc++.6.0.9.tbd

在ios Xcode10下小白都能解决library not found for -libstdc+

在ios Xcode10下小白都能解决library not found for -libstdc++.6.0.9

Xcode 10, Swift 4.2及iOS 12升级适配

产品资讯 | mPaaS 10.1.68 适配 iOS 15