關于 invalid bitcode signature
今天拾起了一個老項目爱谁,調試了一下茅逮,出現如下錯誤憔购。
慣例Google了一下焦匈,搜索的關鍵字為:invalid bitcode signature赘淮,解決的方案很多辕录,如下所示:
invalid bitcode signature解決方案
1.Clean重啟
首先要做的就是網管的終極套路,關機重啟梢卸,所以我們遇到問題當然就是Clean Project and Build走诞,不行就Restart Xcode,其實很多莫名奇怪的問題都可以通過這樣的方案搞定蛤高,畢竟Xcode確實bug不少蚣旱,不知道是不是我的mac性能差碑幅,我的Xcode就經常出現找不到頭文件或者聯想不出關鍵字的問題。
2.修改Bitcode檢測
Bitcode.png
3.Build Active Architecture Only設置
Build Active Architecture Only.png
我把所有的組合搭配都試過了塞绿,Debug -> YES/NO沟涨,Release -> YES/NO,各種搭配异吻,各種配搭裹赴,無奈,It doesn't work诀浪。
4.刪除DerivedData文件夾
打開xcode找到Products文件夾 -> Products文件夾里的.app文件棋返,show in Finder 選擇三欄顯示模式 -> 往前滑找到DerivedData文件夾, 刪除 雷猪。
DerivedData.png
It doesn't work睛竣。
5.Custom Compiler Flags
在Building Seting -> 中 -> Custom Compiler Flags加 -> -fembed-bitcode
Custom Compiler Flags.png
It doesn't work。
至此春宣,基本上Google上所有的方案都是這幾個酵颁,然而都沒有解決我的問題,所以果斷換關鍵字搜索月帝,也就是linker command failed with exit code 1躏惋,可能出現的兩個Error都是因為linker command failed with exit code 1。
linker command failed with exit code 1解決方案
1嚷辅,看看是不是有新添加的文件跟之前文件同名
2簿姨,錯誤信息中出現了某個類的名字,去原文件中看看#import了哪些第三方庫簸搞,把這些庫挨個注釋排除扁位,找到出錯的那個庫,然后按照官方提供的步驟重新添加一遍趁俊。
3.SVN或git忽略了某些文件域仇,如.o 等文件沒能update下來,查看.o文件可能是紅色的寺擂,可以重新添加或者修改SVN(git)的忽略設置
4.把.a文件刪除再重新拖到項目中解決問題
5.可能重復添加了文件(也可能沒勾選 Copy items if neded 這個選項)暇务,建議刪除后重新添加
6.工程中文件名重復了 也會出現同樣的錯誤
7.”Build Settings”->”Enable Bitcode”設置為NO ,因為有些SDK不支持Bitcode
8.可能在引用的時候 可能寫的是#import "XXXXX.m" 怔软,如果是改為#import "XXXXX.h"
9.可能你導入的SDK只能在真機下才能運行垦细,模擬器會報錯!
10.找到 Build settings->Linking->Other Linker Flags將此屬性修改成-all_load 或者 -ObjC
11.Build settings->Search Path->Library Search Paths 添加靜態(tài)庫的相應路徑
我的解決方案
以上方案我基本上都做了挡逼,無奈還是沒搞定括改,我就在猜測是不是靜態(tài)庫版本的問題,因為我的Xcode已經升級到了最新的版本家坎,而項目是挺老的項目了嘱能,所以秉承著打破砂鍋問到底的精神果斷去下載老版本的Xcode吝梅,通常我們可以在App Store應用商店中免費下載Xcode的最新版本,但如果我們想要獲取特定版本呢焰檩?蘋果在開發(fā)者網站中提供了歷史所有版本的系統(tǒng)和開發(fā)工具的下載憔涉,網址:developer.apple.com/download/mo…。
幸運的是公司的網絡比較快析苫,Xcode7很快下載下來了兜叨,然后及時如何讓兩個版本共存,其實直接給Xcode改名即可衩侥,可以一個版本保留原名国旷,另一個版本加上版本號。也可以給多個版本都加上版本號茫死,例如Xcode7和Xcode8跪但。需要注意的是,如果你有使用第三方開發(fā)工具峦萎,請盡量避免在名稱中出現空格屡久。
Xcode安裝好了以后,果斷真機調試爱榔,你猜的沒錯Could not find Developer Disk Image被环,公司最低版本的手機為iOS 9.3.5的iPhone4s,而我下載的Xcode7最高支持的設備為iOS 9.0详幽,此時解決的辦法有兩個筛欢,要么升級Xcode,要么下載該Disk Image唇聘,兩者相比較當然是厚顏無恥的去問別人要了一個9.3版本的Disk Image版姑,然后放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport目錄下,重啟Xcode迟郎,編譯運行通過剥险。
iOS 經典錯誤library not found for -lXXX
開發(fā)中經常會和ibrary not found for -xxx
打交道,尤其是我們從遠程倉庫或者github clone下來一個項目宪肖,編譯很有可能報這個錯誤炒嘲。如下圖:
library not found for -lXXX 屬于iOS經典錯誤之一。下面我們通過復現這個錯誤的方式來說明這個錯誤的解決方法匈庭。其中l(wèi)是lib(library)的意思。
首先聲明浑劳,我的工程中引用了友盟的統(tǒng)計SDK阱持,名稱叫做libMobClickLibrary.a
。存儲在 third_party目錄下魔熏,如下圖(左圖為libMobClickLibrary.a在工程目錄/虛擬目錄的位置衷咽,右圖為libMobClickLibrary.a在磁盤目錄/物理目錄的位置):
沒有配置Library Search Paths導致報錯
(1)刪除building setting -> Library Search Paths
下的 $(PROJECT_DIR)/YunFu/third_party/UMAnalytics
鸽扁。如下圖:
那么,你可能會問镶骗,為什么要刪除這個路徑而不是其他的路徑呢桶现?因為我知道這個路徑就是libMobClickLibrary.a靜態(tài)庫的目錄。
(2)command + B編譯項目鼎姊,然后不出所料骡和,我們會遇到下面這個錯誤:
(3)點開這個錯誤,然后就能看到這個經典錯誤相寇,如下圖:
這個錯誤的意思是找不到名字叫做 MobClickLibrary的庫慰于。
至此,我們可知唤衫,就因為我們在Library Search Paths下刪除了$(PROJECT_DIR)/YunFu/third_party/UMAnalytics 導致報這個library not found for -lMobClickLibrary的錯誤婆赠。所以下次遇到同類問題,我們便可知道某個靜態(tài)庫的路徑可能沒有配置佳励。
結論一:沒有配置靜態(tài)庫的search路徑導致出現library not found for lXXX休里。
注意:設置的路徑必須是靜態(tài)庫在磁盤下的路徑(物理目錄),不能設置為項目的虛擬目錄赃承。拿此例來說妙黍,libMobClickLibrary.a的在項目中是放在third_party文件夾下的,而其真正的磁盤路徑是third_party下的UMAnalytics文件夾楣导。
沒有正確配置Library Search Paths導致報錯
上面的情況是废境,我們沒有配置某個靜態(tài)庫的路徑會導致library not found for lXXX錯誤。而有時候筒繁,我們確實在Library Search Paths下配置了靜態(tài)庫路徑噩凹,卻依然報同樣錯誤。此時我們就要考慮毡咏,這個路徑配置的到底對不對驮宴。如下圖(分別是libMobClickLibrary.a正確的路徑和錯誤的路徑):
正確路徑:
錯誤路徑(去掉了最后一級目錄"/UMAnalytics"):
編譯項目依然會報同樣的錯誤library not found for -lMobClickLibrary.a,如下圖:
歸根到底呕缭,原因在于堵泽,我們雖然跟他指定了libMobClickLibrary.a的目錄,但是在所指定的目錄下沒有搜索到靜態(tài)庫libMobClickLibrary.a恢总。此時又分為兩種情況:
情況一:如果我們指定的目錄和靜態(tài)庫libMobClickLibrary.a的目錄完全不相關迎罗,那么需要重新到Library Search Paths下設置(注意:設置的是靜態(tài)庫的磁盤路徑)。
-
情況二:如果我們指定的目錄和靜態(tài)庫的目錄有關系片仿。即纹安,我們指定的目錄是靜態(tài)庫所在目錄的上級目錄,或者是上上級目錄。這種情況下厢岂,無需指定靜態(tài)庫的精確的路徑光督,只需要把non-recursive選項修改為recursive即可。如下圖:
image
因為recursive選項代表在我們指定的目錄下遞歸搜索靜態(tài)庫塔粒。即结借,如果在當前目錄沒有搜索到靜態(tài)庫,那么就去當前目錄的子目錄下繼續(xù)搜索卒茬。默認情況下是non-recursive(非遞歸)的船老。
結論二:雖然Library Search Paths 中配置了靜態(tài)庫的search路徑。但是沒有正確配置而導致出現library not found for lXXX扬虚。
導入第三方framework靜態(tài)庫編譯報錯xxx.h file not found
上面講的是當我們項目導入的是.a靜態(tài)庫努隙,但因為沒有在 Library Search Paths 中配置.a靜態(tài)庫的search路徑,或者是雖然配置了路徑但是路徑配置錯誤而導致出現library not found for -xxx錯誤的解決辦法辜昵。
但我們知道荸镊,在iOS中,靜態(tài)庫有兩種形式:.a格式的靜態(tài)庫和.framework格式的靜態(tài)庫堪置。
那么如果我們的項目中引入了.framework格式的靜態(tài)庫要不要配置search路徑呢躬存?答案是肯定的,無論我們以什么方式導入.framework靜態(tài)庫(cocoapods的方式或者直接把framework靜態(tài)庫拖拽到項目中的方式)舀锨,如果沒有配置framework的search路徑岭洲,同樣會報錯,但報的錯誤卻是和.a格式的靜態(tài)庫有些不同坎匿,如果我們項目中引入了framework格式靜態(tài)庫也使用了靜態(tài)庫(所謂使用就是import了framework靜態(tài)庫中的某個頭文件)盾剩,但沒有配置search路徑,那么就會報 xxx.h file not found 這類錯誤替蔬。如下圖:
因為我的項目中引入了一個叫做PushCenterSDK.framework的靜態(tài)庫告私。同時也使用了這個靜態(tài)庫中的某個API。如下圖所示承桥,分別是靜態(tài)庫在項目中的路徑和磁盤路徑:
我們依然采用復現問題的方式來驗證解決錯誤的方法驻粟,首先,我的項目是可以編譯通過的凶异,然后嘗試在build setting -> Framework Search Paths 下刪除PushCenterSDK.framework的搜索路徑(磁盤路徑)蜀撑,下圖分別是刪除前和刪除后的截圖:
刪除前:
刪除后:
刪除路徑之后編譯項目,發(fā)現出現了如下錯誤XXX.h file not found剩彬, 如下圖:
很顯然酷麦,沒有找到PushCenterSDK 下的TBSDKPushCenterEngine.h文件。
綜上喉恋,framework靜態(tài)庫的路徑也是必須的贴铜,如果項目中的framework靜態(tài)庫的路徑配置錯誤或者沒有配置就會報錯 xxx.h file not found 類似錯誤粪摘。下次遇到這類錯誤,便可以從framework search paths 著手思考绍坝。
同樣,framework靜態(tài)庫的搜索路徑也支持遞歸搜索苔悦,我們不必配置一個精確無誤的路徑轩褐,可以指定一個父級目錄,然后選擇 recursive玖详。
結論:無論我們以什么方式導入.framework靜態(tài)庫(cocoapods的方式或者直接把framework靜態(tài)庫拖拽到項目中的方式)把介,如果沒有配置framework的search路徑,同樣會報錯蟋座,但報的錯誤卻是和.a格式的靜態(tài)庫有些不同拗踢,如果我們項目中引入了framework格式靜態(tài)庫也使用了靜態(tài)庫(所謂使用就是import了framework靜態(tài)庫中的某個頭文件),但沒有配置search路徑向臀,那么就會報 xxx.h file not found 這類錯誤
在開發(fā)的過程中難免會遇到很多的錯誤巢墅,可是當看到系統(tǒng)給出的英文時,又不知道是什么意思券膀。所以這篇文章總結了Xcode中常見的一些英文單詞及詞組君纫,可以幫助初學的人快速了解給出的提示。多練習芹彬,就肯定能基本掌握蓄髓。
expression:表達式
assignable:賦值> variable:變量+> redefinition:重復定義> type:類型> conflicting:沖突項> invalid:無效的> conversion:轉換> specifier:說明符> indent:縮進> operands:運算對象、操作數> binary:二進制> expected:期望> logical:邏輯> const :常量> constant:常量> statements:語句> initialization:初始化> condition:條件> increment:增量> index:索引舒帮、下標> abbrev:簡寫会喝、縮寫> alias:別名归敬,化名> modified:修改/改進的> parameter:參數> implicit:隱含的> undo:取消> redo:重做> cancel:取消> octal:八進制的> incompatible:不匹配的> duplicate:重復> action:行為> instance:實例> modify:修改> general:普通的 in general:大體诊笤,一般來說> subclass:子類> superclass:父類> inherit:繼承> contents:內容> primitive:原始的> modify:修改> ordered:有序的> collection:集合> dynamic:動態(tài)的> querying:查詢> deriving:派生> description:描述兵迅,描寫> collection:集合> programmatic:編程的> a set of:一系列取试、一組> overview :概述> related 相關的> declared in:聲明在...(文件里)> availability:可用的> framework:框架媚赖、類庫> Conforms to:服從....協(xié)議> Conforms :服從> dynamic:動態(tài)> term:條目> exact:確切的> membership:成員> entry:條目> consists of:由...組成> unique:獨特的矫限、唯一的> determined:決定> conform to:服從催式,遵照> protocol:協(xié)議> distinct:不同的徽曲、獨特的> addition:添加临庇、增加> literals:字面量> denote:表示反璃,指示> category:類目、分類> concrete:具體的> decouples:解耦> KVC:Key-Value Coding:鍵值對編碼> > Getting Numeric Values:獲得一個數值> Identifying and Comparing Strings:識別和比較字符串> Replacing Substrings:替換子串> Finding Characters and Substrings:查找字符和子串> Dividing Strings:分割字符串> Combining Strings:拼接字符串> Getting C Strings:得到c語言的字符串> Getting Characters and Bytes:獲取字符或字節(jié)> Getting a String’s Length:得到字符串的長度> Writing to a File or URL:把內容寫到一個文件或者URL里> Creating and Initializing a String from a File:從文件里創(chuàng)建并初始化一個字符串> Deprecated:棄用> Creating and Initializing Strings:創(chuàng)建初始化字符串> tasks:功能> Adopted Protocols:采用的/服從的協(xié)議1: local declaration “XXX”hide instance variable
reason:一般是你函數里面定義的變量和class屬性變量重名了假夺。很少有和系統(tǒng)變量重名的情況淮蜈。 這樣的情況,修改一下變量的名字就好已卷。2梧田、Undefined symbols for architecture x86_64:
可能由于某些類庫不支持64位Architecture造成,
可以在項目Build Setting=》Architecture設為非64位的選項3、編譯warning:ld: warning: directory not foundfor option
選擇工程, 編譯的 (targets)
選擇 Build Settings 菜單
查找 Library Search Paths 和 Framework Search Paths裁眯,刪掉編譯報warning的路徑即OK4鹉梨、Undefined symbols for architecture armv7s: “OBJC_CLASS$_SZAdWebViewDelegate”, referenced from:xxxx
查找了半天,總以為缺少某個文件穿稳,后對比正常的sample發(fā)現問題出在armv7s存皂,這是針對iPhone5 cpu優(yōu)化的編譯,可能你某個庫不支持逢艘,解決方法是:
Build Setting->Build Active Architecture only 的值由NO設為YES旦袋,查了一下這個選項的資料:這個屬性設置為yes,是為了debug的時候編譯速度更快它改,它只編譯當前的architecture版本疤孕。
而設置為no時,會編譯所有的版本央拖。
這個是設備對應的architecture:
armv6:iPhone 2G/3G祭阀,iPod1G/2G
armv7:iPhone 3GS/4/4s,iPod3G/4G爬泥,iPad1G/2G/3G
armv7s:iPhone5, iPod5
編譯出的版本是向下兼容的(不太對柬讨,應該說,設備是向下兼容的)袍啡,比如你設置此值為yes踩官,用iphone4編譯出來的是armv7版本的,iphone5也可以運行境输,但是armv6的設備就不能運行蔗牡。
所以,一般debug的時候可以選擇設置為yes嗅剖,release的時候要改為no辩越,以適應不同設備。5信粮、Xcode “Attaching to…” 卡住黔攒,模擬器停留在啟動界面
網上有很多方法,什么Clean Build Folder强缘,和各種刪除督惰,但有一個點是優(yōu)先要考慮的,就是host沒有修改過旅掂,修復如下:1赏胚、error: macro names must be identifiers YourProject_prefix.pch
原因: 因為你弄臟了預處理器宏,在它處于<Multiple Values>的時候修改了它
解決方法: Configiration選擇All Configirations商虐,清空它 然后分別重新定義你的Debug,Release,Distributin預處理器宏吧
2觉阅、warning: no rule to process file '$(PROJECT_DIR)/LoadingView.h' of type sourcecode.c.h for architecture armv6
原因: Target里Compile Sources里含有頭文件 了崖疤,那里面不需要頭文件
解決方法: 從Target里Compile Sources里刪除頭文件
3、Command /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support.xcplugin/Contents/Resources/copypng failed with exit code 1
原因: png圖像文件拷貝失敗典勇,看看信息上面提示Can't find哪個文件劫哼,一般都是從文件系統(tǒng)里刪除文件而沒有通過Xcode刪除造成的,Xcode的項目配置文件依然紀錄著這個文件的引用
解決辦法: 給文件系統(tǒng)里增加相應的文件割笙,或者從Xcode的Groups & Files刪除它沦偎,或者從Target的Copy Bundle Resources里刪除它
4、Code Sign error: The identity 'iPhone Developer: Your Name' doesn't match any valid certificate/private key pair in the default keychain
原因: 簽名錯誤
解決辦法: Target -> Get Info -> Build -> Code Signing -> 修改簽名
記得左上角的Configuration類型要跟當前Build類型對應(Debug, Release, Distribution)咳蔚,否則改了也白改
5、could not create bundle folder for versioned model *.moda(好像是這個后綴名的這個文件)
原因:編譯一次會產生一個新的
解決辦法:應該把編譯產生出來的moda文件都刪了,然后clean下工程,重新build即可
6搔驼、error:There are no valid certificate/private key pairs in the default keychain
7谈火、error:Cannot assign to 'self' outside of a method in the init family
原因:只能在init方法中給self賦值,Xcode判斷是否為init方法規(guī)則:方法返回id舌涨,并且名字以init +大寫字母開頭+其他 為準則糯耍。例如:- (id) initWithXXX;
出錯代碼:- (id) Myinit{
self = [super init];
……
}
解決方法:- (id) initWithMy
{
self = [super init];
}1, iOS真機調試時囊嘉,報錯:failed to get the task for process 20900
原因:
證書問題温技,project和targets的證書都必須是開發(fā)證書,ADHOC的證書會出現此問題扭粱。
解決方案:
project和targets的證書使用開發(fā)證書舵鳞。
2,當 一個socket正在連接琢蛤,這時又一個新的socket建立鏈接蜓堕,會拋出錯誤 “ Attempting to connect while connected or accepting connections. Disconnect first.”。
原因:
第一個socket還沒返回isConnected 為YES博其, 就建立第二個socket連接套才。
解決方案:
AsyncSocket有個屬性叫isDisconnected,但接口并未開放慕淡,將- (BOOL)isDisconnected;
加入到AsyncSocket.h中背伴。
然后在連接處:
if(![_sendSocket isDisconnected])
{
[_sendSocket disconnect];
}
3,tcp socket willDisconnectWithError:Error Domain=NSPOSIXErrorDomain Code=65
"The operation couldn’t be completed. No route to host"
No route to host (socket error ::10065)
產生此問題的原因:網絡連接不上此服務器峰髓。
解決:查看ip是否正確傻寂,查看調試設備網絡連接是否正常。
4,報錯:CALayer bounds contains NaN:
繪圖時儿普,某個長寬值中包含除數為0的操作崎逃。5,報錯:libxml/tree.h not found
解決方案:
步驟1:
工程-->PROJECT-->Build Settings
將“Header Search Paths”的值設置為<${SDK_DIR}/usr/include/libxml2>即可。
步驟2:
工程-->TARGETS-->Build Settings
將“Header Search Paths”的值設置為<${SDK_DIR}/usr/include/libxml2>即可眉孩。
我虐代碼千百遍个绍,代碼待我如初戀勒葱!