關(guān)于 invalid bitcode signature
今天拾起了一個老項目,調(diào)試了一下,出現(xiàn)如下錯誤。
慣例Google了一下,搜索的關(guān)鍵字為:invalid bitcode signature,解決的方案很多,如下所示:
invalid bitcode signature解決方案
1.Clean重啟
首先要做的就是網(wǎng)管的終極套路,關(guān)機重啟,所以我們遇到問題當然就是Clean Project and Build,不行就Restart Xcode,其實很多莫名奇怪的問題都可以通過這樣的方案搞定,畢竟Xcode確實bug不少,不知道是不是我的mac性能差,我的Xcode就經(jīng)常出現(xiàn)找不到頭文件或者聯(lián)想不出關(guān)鍵字的問題。
2.修改Bitcode檢測
Bitcode.png
3.Build Active Architecture Only設(shè)置
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上所有的方案都是這幾個,然而都沒有解決我的問題,所以果斷換關(guān)鍵字搜索,也就是linker command failed with exit code 1,可能出現(xiàn)的兩個Error都是因為linker command failed with exit code 1。
linker command failed with exit code 1解決方案
1,看看是不是有新添加的文件跟之前文件同名
2,錯誤信息中出現(xiàn)了某個類的名字,去原文件中看看#import了哪些第三方庫,把這些庫挨個注釋排除,找到出錯的那個庫,然后按照官方提供的步驟重新添加一遍。
3.SVN或git忽略了某些文件,如.o 等文件沒能update下來,查看.o文件可能是紅色的,可以重新添加或者修改SVN(git)的忽略設(shè)置
4.把.a文件刪除再重新拖到項目中解決問題
5.可能重復添加了文件(也可能沒勾選 Copy items if neded 這個選項),建議刪除后重新添加
6.工程中文件名重復了 也會出現(xiàn)同樣的錯誤
7.”Build Settings”->”Enable Bitcode”設(shè)置為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已經(jīng)升級到了最新的版本,而項目是挺老的項目了,所以秉承著打破砂鍋問到底的精神果斷去下載老版本的Xcode,通常我們可以在App Store應用商店中免費下載Xcode的最新版本,但如果我們想要獲取特定版本呢?蘋果在開發(fā)者網(wǎng)站中提供了歷史所有版本的系統(tǒng)和開發(fā)工具的下載,網(wǎng)址:developer.apple.com/download/mo…。
幸運的是公司的網(wǎng)絡(luò)比較快,Xcode7很快下載下來了,然后及時如何讓兩個版本共存,其實直接給Xcode改名即可,可以一個版本保留原名,另一個版本加上版本號。也可以給多個版本都加上版本號,例如Xcode7和Xcode8。需要注意的是,如果你有使用第三方開發(fā)工具,請盡量避免在名稱中出現(xiàn)空格。
Xcode安裝好了以后,果斷真機調(diào)試,你猜的沒錯Could not find Developer Disk Image,公司最低版本的手機為iOS 9.3.5的iPhone4s,而我下載的Xcode7最高支持的設(shè)備為iOS 9.0,此時解決的辦法有兩個,要么升級Xcode,要么下載該Disk Image,兩者相比較當然是厚顏無恥的去問別人要了一個9.3版本的Disk Image,然后放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport目錄下,重啟Xcode,編譯運行通過。
iOS 經(jīng)典錯誤library not found for -lXXX
開發(fā)中經(jīng)常會和ibrary not found for -xxx
打交道,尤其是我們從遠程倉庫或者github clone下來一個項目,編譯很有可能報這個錯誤。如下圖:
library not found for -lXXX 屬于iOS經(jīng)典錯誤之一。下面我們通過復現(xiàn)這個錯誤的方式來說明這個錯誤的解決方法。其中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)點開這個錯誤,然后就能看到這個經(jīng)典錯誤,如下圖:
這個錯誤的意思是找不到名字叫做 MobClickLibrary的庫。
至此,我們可知,就因為我們在Library Search Paths下刪除了$(PROJECT_DIR)/YunFu/third_party/UMAnalytics 導致報這個library not found for -lMobClickLibrary的錯誤。所以下次遇到同類問題,我們便可知道某個靜態(tài)庫的路徑可能沒有配置。
結(jié)論一:沒有配置靜態(tài)庫的search路徑導致出現(xiàn)library not found for lXXX。
注意:設(shè)置的路徑必須是靜態(tài)庫在磁盤下的路徑(物理目錄),不能設(shè)置為項目的虛擬目錄。拿此例來說,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的目錄完全不相關(guān),那么需要重新到Library Search Paths下設(shè)置(注意:設(shè)置的是靜態(tài)庫的磁盤路徑)。
-
情況二:如果我們指定的目錄和靜態(tài)庫的目錄有關(guān)系。即,我們指定的目錄是靜態(tài)庫所在目錄的上級目錄,或者是上上級目錄。這種情況下,無需指定靜態(tài)庫的精確的路徑,只需要把non-recursive選項修改為recursive即可。如下圖:
image
因為recursive選項代表在我們指定的目錄下遞歸搜索靜態(tài)庫。即,如果在當前目錄沒有搜索到靜態(tài)庫,那么就去當前目錄的子目錄下繼續(xù)搜索。默認情況下是non-recursive(非遞歸)的。
結(jié)論二:雖然Library Search Paths 中配置了靜態(tài)庫的search路徑。但是沒有正確配置而導致出現(xiàn)library not found for lXXX。
導入第三方framework靜態(tài)庫編譯報錯xxx.h file not found
上面講的是當我們項目導入的是.a靜態(tài)庫,但因為沒有在 Library Search Paths 中配置.a靜態(tài)庫的search路徑,或者是雖然配置了路徑但是路徑配置錯誤而導致出現(xiàn)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)庫在項目中的路徑和磁盤路徑:
我們依然采用復現(xiàn)問題的方式來驗證解決錯誤的方法,首先,我的項目是可以編譯通過的,然后嘗試在build setting -> Framework Search Paths 下刪除PushCenterSDK.framework的搜索路徑(磁盤路徑),下圖分別是刪除前和刪除后的截圖:
刪除前:
刪除后:
刪除路徑之后編譯項目,發(fā)現(xiàn)出現(xiàn)了如下錯誤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。
結(jié)論:無論我們以什么方式導入.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)給出的英文時,又不知道是什么意思。所以這篇文章總結(jié)了Xcode中常見的一些英文單詞及詞組,可以幫助初學的人快速了解給出的提示。多練習,就肯定能基本掌握。
expression:表達式
assignable:賦值> variable:變量+> redefinition:重復定義> type:類型> conflicting:沖突項> invalid:無效的> conversion:轉(zhuǎn)換> specifier:說明符> indent:縮進> operands:運算對象、操作數(shù)> binary:二進制> expected:期望> logical:邏輯> const :常量> constant:常量> statements:語句> initialization:初始化> condition:條件> increment:增量> index:索引、下標> abbrev:簡寫、縮寫> alias:別名,化名> modified:修改/改進的> parameter:參數(shù)> implicit:隱含的> undo:取消> redo:重做> cancel:取消> octal:八進制的> incompatible:不匹配的> duplicate:重復> action:行為> instance:實例> modify:修改> general:普通的 in general:大體,一般來說> subclass:子類> superclass:父類> inherit:繼承> contents:內(nèi)容> primitive:原始的> modify:修改> ordered:有序的> collection:集合> dynamic:動態(tài)的> querying:查詢> deriving:派生> description:描述,描寫> collection:集合> programmatic:編程的> a set of:一系列、一組> overview :概述> related 相關(guān)的> 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:獲得一個數(shù)值> 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:把內(nèi)容寫到一個文件或者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:一般是你函數(shù)里面定義的變量和class屬性變量重名了。很少有和系統(tǒng)變量重名的情況。 這樣的情況,修改一下變量的名字就好。2、Undefined symbols for architecture x86_64:
可能由于某些類庫不支持64位Architecture造成,
可以在項目Build Setting=》Architecture設(shè)為非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ā)現(xiàn)問題出在armv7s,這是針對iPhone5 cpu優(yōu)化的編譯,可能你某個庫不支持,解決方法是:
Build Setting->Build Active Architecture only 的值由NO設(shè)為YES,查了一下這個選項的資料:這個屬性設(shè)置為yes,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本。
而設(shè)置為no時,會編譯所有的版本。
這個是設(shè)備對應的architecture:
armv6:iPhone 2G/3G,iPod1G/2G
armv7:iPhone 3GS/4/4s,iPod3G/4G,iPad1G/2G/3G
armv7s:iPhone5, iPod5
編譯出的版本是向下兼容的(不太對,應該說,設(shè)備是向下兼容的),比如你設(shè)置此值為yes,用iphone4編譯出來的是armv7版本的,iphone5也可以運行,但是armv6的設(shè)備就不能運行。
所以,一般debug的時候可以選擇設(shè)置為yes,release的時候要改為no,以適應不同設(shè)備。5、Xcode “Attaching to…” 卡住,模擬器停留在啟動界面
網(wǎng)上有很多方法,什么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(好像是這個后綴名的這個文件)
原因:編譯一次會產(chǎn)生一個新的
解決辦法:應該把編譯產(chǎn)生出來的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真機調(diào)試時,報錯:failed to get the task for process 20900
原因:
證書問題,project和targets的證書都必須是開發(fā)證書,ADHOC的證書會出現(xiàn)此問題。
解決方案:
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)
產(chǎn)生此問題的原因:網(wǎng)絡(luò)連接不上此服務(wù)器。
解決:查看ip是否正確,查看調(diào)試設(shè)備網(wǎng)絡(luò)連接是否正常。
4,報錯:CALayer bounds contains NaN:
繪圖時,某個長寬值中包含除數(shù)為0的操作。5,報錯:libxml/tree.h not found
解決方案:
步驟1:
工程-->PROJECT-->Build Settings
將“Header Search Paths”的值設(shè)置為<${SDK_DIR}/usr/include/libxml2>即可。
步驟2:
工程-->TARGETS-->Build Settings
將“Header Search Paths”的值設(shè)置為<${SDK_DIR}/usr/include/libxml2>即可。
我虐代碼千百遍,代碼待我如初戀!