Xcode10适配libstdc++.6.0.9.tdb

一:引言

libstdc++ 自从 Xcode 8 宣布不建议使用后,终于在 Xcode 10 中被直接删掉。其中包括 stdc++, stdc++.6.0.9, libstdc++.6.0.9.tbd(新的动态库), libstdc++.6.0.9.dylib(旧的动态库)。

二:适配过程

升级Xcode10之后的确如此,报错:library not found for -lstdc++.6.0.9

错误描述

看到有帖子说如果是第三方报这个错,联系第三方适配Xcode10。于是。。就有开发联系了我,问我啥时候适配呢?好吧,我是做SDK的,那就赶紧适配吧。

方案一:Xcode 9 中 关于 libstdc++ 的文件复制一份到 Xcode 10 中

说实话,这个方案并不适合我,因为我做的不是项目,而是SDK,我不能强制开发者这么做,这个是等待第三方适配的临时方案吧。再一个我也试了试,真机没有问题,但是模拟器在iOS12时会出现闪退。

方案二:重新编译,使用到 libstdc++ 的 API 的库重新修改代码,链接到 libc++

SDK在Xcode10中真机正常运行,但是模拟器下报错信息如下:

Undefined symbols for architecture x86_64:
  "std::_List_node_base::hook(std::_List_node_base*)", referenced from:
      std::list >::_M_insert(std::_List_iterator, AudioDataStruct* const&) in libLECPlayerFoundation.a(ios_audio_out.o)
      std::list >::insert(std::_List_iterator, lec_pic_t* const&) in libLECPlayerFoundation.a(ios_video_dec.o)
      std::list >::_M_insert(std::_List_iterator, lec_pic_t* const&) in libLECPlayerFoundation.a(ios_video_dec.o)
  "std::_List_node_base::unhook()", referenced from:
      std::list >::_M_erase(std::_List_iterator) in libLECPlayerFoundation.a(ios_audio_out.o)
      std::list >::_M_erase(std::_List_iterator) in libLECPlayerFoundation.a(ios_video_dec.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

很明显是在报的错是C++的API没有找到支持库。于是打开SDK源码,我是用脚本来编译出来的.a文件。看苹果官方的介绍可以得知,C++需要重新编译链接到libc++库,我的操作是在clang语句中加入-stdlib=libc++

编译出.a文件,重新替换工程中的旧.a文件,在Xcode10下真机和模拟器都可以正常运行。适配成功。

想知道Xcode10有哪些新特性,看这里What's new in Xcode 10

本文章在2018年9月首发在CSDN

你可能感兴趣的:(Xcode10适配libstdc++.6.0.9.tdb)