iOS other linker flags

我是寫swift項目的,引入了騰訊雲視頻的SDK,錄製視頻,播放視頻都正常,可是一點擊上傳視頻,app就crash掉了。c++

當時項目是在Xcode7下運行,報的錯就一句話:swift

 libc++abi.dylib: terminating with uncaught exception of type NSException 。
只有這句話,在沒有任何詳細的報錯信息下,我把代碼斷點後,也一直髮現不了緣由。跟騰訊的技術支持交流,那我的他說他也是第一次見這種錯誤,最後說多是oc與swift混編的問題,叫我用oc寫上傳視頻的代碼,還說不少客戶都是oc,實踐過不少次了都沒問題。
我在官網也下載了騰訊雲官網的小直播demo,繞過了用戶校驗,錄製視頻去上傳,上傳沒有崩潰的信息;我也把上傳的代碼抽離,寫成swift上傳,也仍是能夠,並無崩潰。這時,我肯定了並非oc與swift混編的問題。我還懷疑是xcode7與xcode8版本不兼容的問題,特地用xcode7和8分別寫了一個測試的demo,發現xcode7運行上傳視頻仍是crash,用xcode8運行仍是crash,但此次crash有緣由,網上一查找緣由,最後獲得了一個答案是在

Xcode的Other linker flags 加上 -ObjC。

嗚嗚,最後終於能夠了,解決了崩潰的問題,可苦逼的一個過程了,搞了兩天。xcode

對於具體緣由,我網上搜了一些解釋:app

 

Other linker flags設置的值實際上就是ld命令執行時後面所加的參數。測試

下面逐個介紹3個經常使用參數:
-ObjC:加了這個參數後,連接器就會把靜態庫中全部的Objective-C類和分類都加載到最後的可執行文件中。若是靜態庫中有category,那麼須要添加 -ObjC 參數標識,不然可能會報:unrecognized selector sent to instance code

-all_load:會讓連接器把全部找到的目標文件都加載到可執行文件中,可是千萬不要隨便使用這個參數!假如你使用了不止一個靜態庫文件,而後又使用了這個參數,那麼你頗有可能會遇到ld: duplicate symbol錯誤,由於不一樣的庫文件裏面可能會有相同的目標文件,因此建議在遇到-ObjC失效的狀況下使用-force_load參數。
-force_load:所作的事情跟-all_load實際上是同樣的,可是-force_load須要指定要進行所有加載的庫文件的路徑,這樣的話,你就只是徹底加載了一個庫文件,不影響其他庫文件的按需加載視頻

相關文章
相關標籤/搜索