一:引言
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<AudioDataStruct*, std::allocator<AudioDataStruct*> >::_M_insert(std::_List_iterator<AudioDataStruct*>, AudioDataStruct* const&) in libLECPlayerFoundation.a(ios_audio_out.o)
std::list<lec_pic_t*, std::allocator<lec_pic_t*> >::insert(std::_List_iterator<lec_pic_t*>, lec_pic_t* const&) in libLECPlayerFoundation.a(ios_video_dec.o)
std::list<lec_pic_t*, std::allocator<lec_pic_t*> >::_M_insert(std::_List_iterator<lec_pic_t*>, lec_pic_t* const&) in libLECPlayerFoundation.a(ios_video_dec.o)
"std::_List_node_base::unhook()", referenced from:
std::list<AudioDataStruct*, std::allocator<AudioDataStruct*> >::_M_erase(std::_List_iterator<AudioDataStruct*>) in libLECPlayerFoundation.a(ios_audio_out.o)
std::list<lec_pic_t*, std::allocator<lec_pic_t*> >::_M_erase(std::_List_iterator<lec_pic_t*>) 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