一:引言
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文件??刺O果官方的介紹可以得知,C++需要重新編譯鏈接到libc++庫,我的操作是在clang語句中加入-stdlib=libc++
。
編譯出.a文件,重新替換工程中的舊.a文件,在Xcode10下真機和模擬器都可以正常運行。適配成功。
想知道Xcode10有哪些新特性,看這里What's new in Xcode 10
本文章在2018年9月首發在CSDN