iOS開發中報錯duplicate symbols for architecture arm64 linker command failed with exit code 1
在對接微信三方登陸SDK時,在demo中沒有任何問題,然而提供給遊戲對接之後便出現了這個問題
duplicate symbols for architecture arm64 linker command failed with exit code 1
經驗告訴我是libGCloundVoice.a和 libiphone-lib.a這兩個庫檔案衝突問題,找遍整個工程也沒見有重複問題。
解決辦法:刪除-all_load編譯項,但是微信第三方登入中的libWeChatSDK.a又需要使用到它,我們可以用-force_load+.a檔案的路徑來替換。
錯誤原因及內容:當我們在工程中用到一些三方SDK時,都會有.a或者.framework靜態庫,這時候如果直接編譯執行就會報錯(有時候沒有用到裡面的方法直接執行時不會報錯,但一旦匯入標頭檔案使用時便會報錯),像這種“_BIO_ctrl”,referenced from等一系類錯誤
這裡報錯原因是:xcode找不到靜態庫檔案裡面的類,所以需要在build setting的linker flags中新增-ObjC,-all_load等flag來告訴連結器把庫裡面的類都新增進來。或者是沒有靜態庫檔案拖入到工程中
other linker flages引數:
-ObjC:告訴連結器把庫中定義的Objective-C類和category都載入進來。這樣編譯後APP會變大,因為載入了其他OC程式碼進來。但是如果靜態庫中有類和category的話只有加入這個flag才行。
-all_load:這個flag是專門處理-ObjC的一個bug的,用了-ObjC以後,如果類庫中只有category沒有類的時候這些category還是載入不進來,變通方法就是加入-all_load或者-force-load。-all_load會強制連結器把目標檔案都載入進來,即使沒有objc程式碼。
注意:假如你使用了不止一個靜態庫檔案,然後又使用了這個引數,那麼你很有可能遇到ld: duplicate symbol錯誤,因為不同的庫檔案裡面可能會有相同的目標檔案
-force_load 這個flag所做的事和-all_load其實是一樣的,只有-force_load需要指定要進行載入的庫檔案的路徑,這樣的話,你就只是完全載入了一個庫檔案,不影響其餘庫檔案的按需載入,-force_load在xcode3.2後可用