1. 程式人生 > >iOS開發常遇錯誤之Xcode編譯Undefined symbols for architecture xxx 錯誤總結

iOS開發常遇錯誤之Xcode編譯Undefined symbols for architecture xxx 錯誤總結

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

可能會遇到這幾種錯誤:
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_64

錯誤原因分析
1、大部分情況下是忘記添加了某個系統framework或dylib吧,比如你在專案中使用了sqlite3,但是沒有新增libsqlite3.dylib,就會出現這個問題。解決辦法是增加對應的framework或dylib。
2、如果是在C++裡呼叫C函式,檢查是否有新增extern "C",這可以通過觀察錯誤提示中的函式名形式來決定,如果是C函式而以C++的方式呼叫就需要新增extern "C"。
3、如果是把其它工程的xcodeproj檔案加入到當前專案中,檢查Build Phases中的Target Dependencies有沒有新增依賴,以及General中的Linked Frameworks and Libraries有沒有新增相關的.a檔案。
4、如果新增.a檔案編譯無錯而新增xcodeproj檔案編譯出錯可參考3
5、如果新增.a檔案編譯出錯,首先檢查其對應的標頭檔案是否新增正確,或者在Build Setting中有沒有新增對應的Header Search Path路徑;其次檢查.a檔案的c++編譯選項與當前專案的c++編譯選項是否一致;最後檢查.a檔案與當前專案的CPU架構資訊是否一致
6、如果是extern變數報這個錯誤,要檢查extern變數有沒有在其它地方宣告,如果沒有則加上;如果外部變數在靜態庫中,可根據5檢查引用標頭檔案或標頭檔案搜尋路徑是否正確;如果標頭檔案無問題,就需要檢查靜態庫與與當前專案的CPU架構資訊是否一致
7、如果是使用了靜態庫,真機Debug測試時正常,而在執行for iOS Device測試時報這個錯誤,很可能是因為靜態庫支援的架構不全。出現這種情況是Build Setting中的Build Active Architecture Only在Debug下設為Yes,從而使得真機Debug測試正常。

8、如果只有@interface,沒有@implementation也會導致這個錯誤

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

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

在@end處提示expected }錯誤解決
問題很明顯是}匹配出現問題了。如果程式碼少很好找,如果程式碼很多怎麼縮小查詢範圍呢?一般出現這個問題時伴隨另一個錯誤:在某個函式定義處提示"Use of undeclared identifire 'someMethod'”,那麼就是在此函式定義之前的地方少了一個},導致編譯器誤把函式定義當成函式呼叫了。