Xcode編譯Undefined symbols for architecture xxx 錯誤總結

領個紅包,支持一下做者

這是支付寶推出的一個最新活動,用支付寶掃碼即有紅包送,0元到99元不等,紅包能夠到店支付使用,每日僅可領一次。你每用一個紅包,做者便可獲得支付寶送出的1毛賞金,若是你以爲這篇文章對你有用,那不如掃碼支持一下做者吧!c++

 

每次遇到這種錯誤就頭痛,不知道要害死多少腦細胞了,就在這裏作個總結吧sql

可能會遇到這幾種錯誤:
Undefined symbols for architecture armv7
Undefined symbols for architecture armv7s
Undefined symbols for architecture arm64
Undefined symbols for architecture i386
Undefined symbols for architecture x86_64xcode

錯誤緣由分析架構

0、若是隻有@interface,沒有@implementation也會致使這個錯誤ide

一、注意看Build Phases裏面的Compile Sources裏面有沒有被報錯的類文件,若是沒有的話也會報上面的錯誤
二、大部分狀況下是忘記添加了某個系統framework或dylib吧,好比你在項目中使用了sqlite3,可是沒有添加libsqlite3.dylib,就會出現這個問題。解決辦法是增長對應的framework或dylib。
三、若是是在C++裏調用C函數,檢查是否有添加extern "C",這能夠經過觀察錯誤提示中的函數名形式來決定,若是是C函數而以C ++的方式調用就須要添加extern "C"。
四、若是是把其它工程的xcodeproj文件加入到當前項目中,檢查Build Phases中的Target Dependencies有沒有添加依賴,以及General中的Linked Frameworks and Libraries有沒有添加相關的.a文件。
五、若是添加.a文件編譯無錯而添加xcodeproj文件編譯出錯可參考3
六、若是添加.a文件編譯出錯,首先檢查其對應的頭文件是否添加正確,或者在Build Setting中有沒有添加對應的Header Search Path路徑;其次檢查.a文件的c++編譯選項與當前項目的c++編譯選項是否一致;最後檢查.a文件與當前項目的CPU架構信息是否一致
七、若是是extern變量報這個錯誤,要檢查extern變量有沒有在其它地方聲明,若是沒有則加上;若是外部變量在靜態庫中,可根據5檢查引用頭文件或頭文件搜索路徑是否正確;若是頭文件無問題,就須要檢查靜態庫與與當前項目的CPU架構信息是否一致
八、若是是使用了靜態庫,真機Debug測試時正常,而在執行for iOS Device測試時報這個錯誤,極可能是由於靜態庫支持的架構不全。出現這種狀況是Build Setting中的Build Active Architecture Only在Debug下設爲Yes,從而使得真機Debug測試正常。函數

 

9. 若是是用Cocoapods集成第三庫,且是引用第三方庫時出現上述相似問題,須要注意在build setting裏面的other linker flags裏添加 $(inherited),這個是從pod install裏看到解決方法的。測試

檢查靜態庫的CPU架構支持命令
lipo -info xxxxx.a

找出不支持arm64的靜態庫
find . -name *.a -exec lipo -info "{}" \;

在@end處提示expected }錯誤解決
問題很明顯是}匹配出現問題了。若是代碼少很好找,若是代碼不少怎麼縮小查找範圍呢?通常出現這個問題時伴隨另外一個錯誤:在某個函數定義處提示"Use of undeclared identifire 'someMethod'」,那麼就是在此函數定義以前的地方少了一個},致使編譯器誤把函數定義當成函數調用了。ui

相關文章
相關標籤/搜索