1. 程式人生 > >Xcode10適配之libstdc++.6.0.9.tdb

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<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)

很明顯是在我的SDK裡報的錯,C++的API沒有找到支援庫,於是開啟SDK原始碼,我是用指令碼來編譯出來的.a檔案。看蘋果官方的介紹可以得知,C++需要重新編譯連結到libc++庫,我的操作是在clang語句中加入-stdlib=libc++。 編譯出.a檔案,重新替換工程中的舊.a檔案,在Xcode10下真機和模擬器都可以正常執行。適配成功。 想知道Xcode10有哪些新特性,看這裡What’s new in Xcode 10