Undefined symbols for architecture arm64(其cpu架構(gòu))
"OBJC_CLASS$_XXX",referenced from: 之類(lèi)的問(wèn)題,很多人看到這些很頭疼,不知道從何下手去修改贝次。以下是我總結(jié)的相關(guān)修改辦法暗膜。如下圖
這是一個(gè)在arm64架構(gòu)下印机,找不到定義的錯(cuò)誤矢腻。 這類(lèi)錯(cuò)誤我總結(jié)的就六種,.m 缺失射赛、靜態(tài)庫(kù)沒(méi)導(dǎo)入(不支持arm64 架構(gòu)多柑,現(xiàn)在基本都支持了,如果不支持更新相關(guān)靜態(tài)庫(kù)楣责。怎么查看參考文末)竣灌、library路徑問(wèn)題、header 文件路徑秆麸、Valid Architectures 指定錯(cuò)誤初嘹,連接器參數(shù)問(wèn)題
1.那么首先檢查 Architectures 選項(xiàng)
通常情況下,Build Active Architectures Only 在Debug 模式為YES,Release模式為NO蛔屹。
Valid Architectures 為 arm64 armv7 armv7s
需要你了解的是 只有連接了Active 的調(diào)試設(shè)備削樊,這個(gè)選項(xiàng)才生效,只編譯當(dāng)前設(shè)備對(duì)應(yīng)的指令集兔毒。如果你沒(méi)有連接設(shè)備,那么這里即使是YES甸箱,也不會(huì)生效育叁。編譯器會(huì)按照你的Valid Architectures和Architectures指定的二進(jìn)制包進(jìn)行編譯。
具體參考
armv6 設(shè)備: iPhone, iPhone2, iPhone3G, 第一代芍殖、第二代 iPod Touch
armv7 設(shè)備: iPhone3GS, iPhone4, iPhone4S
iPad, iPad2, iPad3(The New iPad), iPad mini
iPod Touch 3G, iPod Touch4
armv7s設(shè)備: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 設(shè)備: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display) 之后出的到X都是arm64的設(shè)備了
2. 向 Link Binary With Libraries 中 添加相應(yīng)的framework 豪嗽,向Compile Source 添加你缺失的.m
3.修改 Other Linker Flags 添加 -ObjC 和 $(inherited),(也可以直接添加缺失的framework 如: -framework "frameworkname" )
4. Header Search Path 和Library Search Path 先添加$(inherited)豌骏,如果編譯后龟梦,沒(méi)有出現(xiàn),就手拖缺失文件的相關(guān)路徑(如果路徑為多層級(jí)窃躲,選擇遞歸搜索recursive 默認(rèn)是non-recursive)
5.最后檢查 framework 和.m 有沒(méi)有 勾選 target membership 计贰。
總之,如果先思考是靜態(tài)庫(kù)問(wèn)題蒂窒,還是其他文件問(wèn)題躁倒,會(huì)節(jié)約很多時(shí)間。以上總結(jié)洒琢,以留檔備查秧秉,也希望可以給別人一些思路。
實(shí)例 1: 錯(cuò)誤信息中有明顯的提示 does not contain bitcode衰抑。 所以 直接設(shè)置 bitcode 為NO 就可以了
查看.a或.framework 的靜態(tài)庫(kù)文件都支持哪些架構(gòu)象迎, 終端 進(jìn)入工程根目錄 find . -name *.a -exec lipo -info "{}" \ 或者.framework