天天看點

iOS 靜态庫-因為CPU架構引起的小問題

前言

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