iOS 靜態庫 在iOS中建立靜態庫

2021-07-10 19:56:29 字數 3779 閱讀 5153

學習了creating a static library in ios tutorial

,本想做一下翻譯的工作,但是在網上已經有人翻譯過了,因此不添足。譯文請見:《在ios中建立靜態庫》

在實踐中,發現了一些奇怪的錯誤。

根據文章編寫了程式,imagefilters,寫了指令碼生成通用靜態庫,在coreimagefun工程中使用。

1、在iphone5s上編譯,必須按照如下設定:

也就是imagefilters靜態庫不支援armv7

2、假如在模擬器上編譯,必須按照如下設定:

也就是說imagefilters靜態庫不支援x86_64

那麼從問題來看,也就是我的imagefilters靜態庫不包含armv7、x86_64指令集。

那麼問題來了,x86_64、arm7分別是什麼?

《ios開發~製作同時支援armv7,armv7s,arm64,i386,x86_64的靜態庫.a》中說明這些屬於的意思。

而我的問題應該就是在生成的靜態庫不是通用型別的。然而文章中推薦的做法是先分別編譯模擬器和真機,在lipo合成。而我是指令碼(如下),因此問題的關鍵就是xcodebuild命令的設定,至少在指令碼中,我並沒有特別設定validarchitecture為armv7 | armv7s | arm64 | i386 | x86_64,因為貌似在工程中直接設定是行不通的。

# define output folder environment variable

universal_outputfolder=$/$-universal

# step 1. build device and simulator versions

xcodebuild -target imagefilters only_active_arch=no -configuration $ -sdk iphoneos build_dir="$" build_root="$"

xcodebuild -target imagefilters -configuration $ -sdk iphonesimulator -arch i386 build_dir="$" build_root="$"

# make sure the output directory exists

mkdir -p "$"

# step 2. create universal binary file using lipo

lipo -create -output "$/lib$.a"

"$/$-iphoneos/lib$.a"

"$/$-iphonesimulator/lib$.a"

# last touch. copy the header files. just for convenience

cp -r "$/$-iphoneos/include"

"$/"

於是,做了一下小嘗試,先分別編譯真機和模擬器再lipo,發現成功編譯。因此我們可以確定,在跑指令碼的時候一定要加上architecture

的設定。

因此接下來的目標是深入了解xcodebuild命令。

簡單的介紹了xcodebuild的語法,但是說的不是很明白,因此實踐了下,語法總結就是:

xcodebuild [-project projectname] [-target targetname ...] [-configuration configurationname]

[-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...]

[-userdefault=value ...]

1、xcodebuild可以帶多個引數,[…]就是乙個引數,引數之間用空格隔開;

2、引數有兩種,一種是空格鏈結,一種是用等號鏈結,如build_root=」$」

2、引數就是乙個對,即-project和projectname是一對,分別為引數名和引數值,如-sdk iphoneos;

3、假如同個引數名需要設定多個引數值,那就需要重複多個,如-arch armv7 -arch armv7s -arch arm64。

因此,我們可以完善下指令碼,如下:

# define output folder environment variable

universal_outputfolder=$/$-universal

# step 1. build device and simulator versions

xcodebuild -target imagefilters -configuration $ -sdk iphoneos -arch armv7 -arch armv7s -arch arm64 build_dir="$" build_root="$"

xcodebuild -target imagefilters -configuration $ -sdk iphonesimulator -arch x86_64 -arch i386 build_dir="$" build_root="$"

# make sure the output directory exists

mkdir -p "$"

# step 2. create universal binary file using lipo

lipo -create -output "$/lib$.a"

"$/$-iphoneos/lib$.a"

"$/$-iphonesimulator/lib$.a"

# last touch. copy the header files. just for convenience

cp -r "$/$-iphoneos/include"

"$/"

中文版的簡介:xcode 自動構建命令——xcodebuild

,後面有彩蛋。

學習了tutorial: using sub-projects & git submodules to create a framework in ios

,真正實踐中發現其實不用文章那麼複雜的設定。

開啟xcode,new/file/project/libraries & framework/cocoa touch static library

你可以在靜態庫裡面新增類,所新增的類,新增的類的標頭檔案必須在target/build phases/copy files 新增,這樣標頭檔案才會出現編譯後的include資料夾中,父工程才能看到。

假如你要弄乙個通用的靜態庫,那你還需要進行如下設定:

假如你有檔案,建議放在.xcassets檔案中,假如你有nib檔案,建議放在.bundle檔案中。

然而,還沒有完,如今xcode6也是可以製作動態庫了,不是說好的蘋果自己用的麼?規則還是會改變的。

學習了《xcode 6製作動態及靜態framework》,發現步驟類似。

在xcode6之前,蘋果是不主動支援靜態庫製作的,於是就有了開源工程github:ios universal framework

。方便了靜態庫的製作。

xcode6出來之後,開源工程宣布不再維護,因此就可以直接用xcode玩耍。

iOS 建立靜態庫

庫是程式 的集合,是共享程式 的一種方式開源庫 閉源庫 靜態庫 a 和 framework 動態庫 dylib 和 framework 靜態庫和動態庫在使用上的區別 然後寫靜態庫的核心 分別選擇真機和模擬器,編譯就會生成靜態庫 每乙個手機都是屬於自己的cpu,不同的cpu採用的是不同的cpu架構 指...

iOS合併靜態庫

對ios專案來說,靜態庫對於裝置 device 和模擬器 simulator 的編譯是不一樣的。需要鏈結靜態庫的工程在編譯device和simulator的時候需要區別對待。需要鏈結到不同的靜態庫。這就很麻煩。解決方法是使用lipo指令,將device靜態庫和simulator靜態庫合併為乙個靜態庫...

iOS靜態庫管理

解決一下幾個問題 1.生成device和simulator通用的.a檔案 2.debug版應用程式呼叫debug版.a,release版應用程式呼叫release版.a 由於ios生成的庫的屬性比較多,因此開發人員需要對靜態庫進行必要的管理。我只是提供了一種我認為比較不錯的辦法,可以相對提高一些效率...