前言
最初 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…