前言
最初 AppStore 不允許自制動態庫的上傳(但在14年的WWDC上開放了動態庫),動態庫與靜態庫的架構例子基本一樣。本文的內容是沒什麼難度的,避免在後續的開發中忽略掉這個問題,只是做一個記錄。
問題
首先看一下在下面圖中Xcode的報錯問題:
這個錯誤其實比較常見了,通過Undefined symbols for architecture x86_64
發現它的意思是:沒有這個x86_64
的architecture
(架構)。圖中的"_OBJC_CLASS_$_Scorpio", referenced from:
的Scorpio
就是我打包出來的靜態庫,這個靜態庫分為2種,一個是真機另一個是模擬器如下圖:
匯入到專案中的是真機環境下的靜態庫,而專案是在模擬器環境下編譯的,所以才會報錯。
iOS的CPU架構簡單說明
其實不用去真正理解CPU架構,只要明白不同的iPhone裝置,它都是有不同的CPU架構(也有相同的),我們開發的App都會在不同的CPU架構下執行。當編譯時,Xcode會先看看你是在模擬器還是在真機,然後確定CPU架構,最後在明確你的靜態庫支不支援這個CPU架構,如果不支援編譯就會報錯。
來看一下iPhone裝置的CPU架構(iPhone 7 Plus還不確定):
可以通過lipo -info libScorpio.a
(libScorpio.a就是你得靜態庫)命令列來檢視靜態庫當前支援的架構,隨便找個第三方SDK (例如:個推推送) 來看看:
注意:只要支援armv7
就不用再支援armv7s
個推推送的靜態庫是支援所有的CPU架構,它的做法就是把真機與模擬器的靜態庫,合併成一個靜態庫(合併的方法不多解釋,相信大家都會)。這種做法的缺點就是靜態庫會很大,最好的辦法就是提供2種檔案給我們使用,一個是真機一個是模擬器,在App上線我們只需要真機的靜態庫。
靜態庫可以是.a
或者.framework
,現在我們的靜態庫一般都用.framework
,這兩種支援CPU架構的方法都是一樣的。
本文章首發地址:www.jianshu.com/p/f2a3e5027…