为什么会报错
Apple大约在五年前就声明即将废弃libstdc++相关c++ lib,只不过到Xcode10才正式不再支持。
实际上目前绝大数项目和第三方库早已不依赖stdc++,一般出这个问题的都是比较老的项目或者依赖了较老版本的第三方库导致。
如何解决
临时解决方案(不推荐)
编译时报not found libstdc++.6.0.9.tbd not found,是因为Xcode10没有这个库,我们可以从低版本的Xcode中拷贝一份过来。
模拟器路径为 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib
真机路径为
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib
把此文件拷贝到Xcode10对应路径即可
此方案能够保证代码正常运行在真机以及iOS11以下的模拟器上,不支持对iOS12的模拟器进行调试。而且,本身这种做法属于强行使用libstdc++,除非有一些很重要的库无法及时替换,否则不太推荐
正式解决方案(推荐)
删除项目中引用的libstdc++和libstdc++.6.0.9.tbd,如果有第三方框架依然依赖libstdc++,请尝试更新库,如果更新也不行,请联系提供方或者更换别的库使用。
如何知道哪些库依赖了libstdc++?
这是很多人比较疑惑的一点,也没有人做过相关解答,因为编译器只会告诉你找不到libstdc++,并没有说是哪些库用到了这个。此处提供一个办法给大家:
使用pod集成的第三方库
请打开项目路径下的pod文件夹,找到Pod.xcodeproj
文件,右键显示包内容
,然后用文本编辑打开project.pbcproj文件。
然后在文本中全局搜索 libstdc++.6.0.9 和 libstdc++,删除所有匹配结果,然后CMD+S保存
手动导入的第三方库
找到工程文件XXXX.xcodeproj
,右键显示包内容
,让然后用文本编辑打开project.pbcproj文件。
然后在文本中全局搜索 libstdc++.6.0.9 和 libstdc++,删除所有匹配结果,然后CMD+S保存
然后返回Xcode,CMD+B编译,如果直接编译成功,说明你的项目并不依赖stdc++,可能是以前的三方库的依赖忘了删除,或者第三方库更新过自己的依赖。
如果编译失败,则会有对应的报错信息告诉你是哪个库缺少依赖,然后就更新对应的库就可以了。