一.前言
由于博主在Xcode9升级到Xcode10,Xcode10升级到Xcode11都遇到这个问题,而且弄得老麻烦了,不过现在好了,问题的原因以及最快捷的解决办法已经找到了. 以下博文是博主参考:https://www.jianshu.com/p/46a1911f9470 所写,在此感谢原博主,但是原博主的百度云失效,并且目录拷贝太麻烦,所以我在修改博主文章的基础上有了此文,并且博主的问题已经解决.
升级Xcode10或者11 后, 项目编译时会报错如下(找不到libstdc++系统库)
原因是: 苹果早在 Xcode 8
中 就废弃了libstdc++
, 给了开发者两年时间过渡, 如今在Xcode 10
中已不再支持. 在Build Phases > Link Binary With Libraries
中已经搜不到libstdc++
的库了
Xcode 10
更多特性, 可以参阅这里
二.解决方案
首先要找到具体是哪个库使用了libstdc++
.我的项目是用cocoapods
管理第三方,可以在Pods/Target Support Files/Pods-xxx.debug.xcconfig
和Pods/Target Support Files/Pods-xxx.release.xcconfig
中, 看到cocoapods
的编译选项有libstdc++6.0.9
手动删除两个文件的-l"stdc++.6.0.9"
后进行编译, 结果如下:
可以看到, 问题出在AMapNaviKit
这个第三方库, 是高德导航库
注意:手动删除 -l"stdc++.6.0.9"之后还要恢复回来
解决方法有两个:
- 方法一. 我的项目中用到的
AmapKitNavi
是很早的2.3.0
的版本,高德导航库的最新版本已经迁移到了libc++
, 故将其更新到最新版本, 即可解决. (博主的问题是一个.a文件依赖这个库,只能让厂家更新.a库了)- 由于高德导航库的前后版本相隔较远, 更新后需要修改部分代码, 为了防止因改动代码而影响原有的逻辑, 我选择了第二种方法.
但开发者最好还是用第一种方法,直接更新第三方, 临时方案毕竟只能过渡用, 做苹果开发还是要跟着苹果爸爸的屁股后走的.(我也推荐)
- 由于高德导航库的前后版本相隔较远, 更新后需要修改部分代码, 为了防止因改动代码而影响原有的逻辑, 我选择了第二种方法.
- 方法二. 原博的方法是拷贝
Xcode 9
中的libstdc++.6.0.9
库文件到Xcode 10
中,但是直接拷贝有两个问题 :1.麻烦,容易蒙圈 2.Xcode10和Xcode11库文件的路径变了,想要看原博的可以直接点击文首链接,下面我介绍用脚本导入的方法
步骤1: 首先到github下载库文件:https://github.com/devdawei/libstdc-
文件目录如下:
文件夹4是模拟器编译所需文件,文件夹1是模拟器运行所需文件,文件夹2是macAPP开发所需文件,文件夹3是iPhone真机所需文件(详情参考文首原博)
步骤2: 然后打开终端cd到libstdc--master文件夹;
如果你使用的是 Xcode 10,则将install-Xcode_10.sh拖到终端中执行即可。Xcode 11 beta 版或者Xcode11则将install-Xcode_11-beta.sh拖到终端中执行。然后Shift+Command+k Clean项目,再重启Xcode之后就好了
注意:
1.如果你安装了不止一个Xcode,一定要打开你那个.sh文件,把路径中的Xcode.app改成(比如Xcode_11.app)你Xcode的名字.
2.如果你打开两个.sh脚本文件会发现两个脚本文件不同的就是库文件的路径
再次感谢原博主麦兜兜买兜兜以及github的devdawei.