踩坑是為了更好的填坑
- 在日常的開發(fā)過程中,關(guān)于靜態(tài)庫和動態(tài)庫,稍不注意,就會出現(xiàn)問題.不僅影響工作效率,當(dāng)你的同事在使用你寫的庫的時候,還會出現(xiàn)各種讓人看不懂的報錯,進(jìn)而懷疑你的編寫水平.究其原因就是在編寫庫的時候,遺漏了一些配置步驟.在此我把這些錯誤列出來,如果以后關(guān)于庫的問題報錯,你可以來查看相關(guān)的報錯信息.
關(guān)于庫的簡單介紹
庫分為兩大類
- 靜態(tài)庫: .a .framework
- 動態(tài)庫: .dylib .framework
- 默認(rèn)情況下,編譯出來的framework庫是一個動態(tài)庫
-
如果想編譯的時候直接將編譯的framework改成靜態(tài)庫: 工程 --> BuildSettings --> mach -> 選擇static lib
Paste_Image.png
使用庫之前,要了解的知識.
- 先來個最常見的
Undefined symbols for architecture arm64
如果出現(xiàn)這樣的報錯,想想自己是不是因為工作太累,而忽略了對真機設(shè)置的編譯.
為了避免大家對設(shè)備架構(gòu)知識的混亂,我整理如下,供大家參考.
首先要明確,每一個設(shè)備都有自己的CPU --> 都有的CPU架構(gòu)(指令集)
每一個靜態(tài)庫都有自己支持的CPU架構(gòu)&不支持的CPU架構(gòu)
* 那么如何查看靜態(tài)庫支持哪些CPU架構(gòu),很簡單,在終端找到庫的位置,輸入下面的命令行就可以查詢到.
lipo -info 靜態(tài)庫名稱
總結(jié)常見模擬器&真機所使用的CPU架構(gòu)
* 模擬器使用的CPU架構(gòu)
iPhone3gs~iPhone5 : i386
iPhone5s~iPhone7plus : x86_64
* 真機設(shè)備CPU架構(gòu)
iPhone3gs~iPhone4s : armv7
iPhone5~iPhone5c : armv7s(只要支持armv7即可)
iPhone5s~iPhone7plus : arm64
如何合并兩個靜態(tài)庫
* lipo -create 靜態(tài)庫1 靜態(tài)庫2 -output 新靜態(tài)庫的名稱
使用庫的小技巧
- 每次編譯的時候,需要切換模擬器, 然后得到想要的 CPU 架構(gòu),這時候我們只需要在工程中配置一下,就不用來回的切換模擬器了.
- 將默認(rèn)的 NO 改為 YES, 那么以后你所編譯的靜態(tài)庫就可以支持所有的模擬器了.
關(guān)于 OC 和 Swift 使用庫的注意點
-
首先要明確 一般情況下,OC不支持動態(tài)庫, Swift 不支持靜態(tài)庫.也就是說,當(dāng)你進(jìn)行混編的時候,是非常痛苦的.因為你很容易就串了.
你會看到以下錯誤.
Snip20161120_6.png - 它會說動態(tài)庫不能被加載.而在 Swift 中,它又提示靜態(tài)庫不能被使用. 這時候你還需要去編譯一個靜態(tài)庫和動態(tài)庫,分別在不同的語言中使用嗎? 我告訴你,根本不需要.只要在工程中一個簡簡單單的配置,就可以實現(xiàn)靜態(tài)庫和動態(tài)庫的雙重使用.
工程 ---> General ---> Embedded Binaries 中添加你編譯的庫,就可以解決這個問題.
先寫這么多,如果大家在開發(fā)中遇到了相關(guān)類似的問題,可以在評論中回復(fù).愿我們的開發(fā)之路越走越好.