1.新建工程選擇Cocoa Touch FrameWork
2.選擇動(dòng)態(tài)庫(kù)支持的系統(tǒng)版本
3.選擇將想要暴露的自定義的頭文件放到Build Phases 的Headers設(shè)置的Public中
4.編譯動(dòng)態(tài)庫(kù),選擇對(duì)應(yīng)的設(shè)備真機(jī)就會(huì)編譯出來真機(jī)對(duì)應(yīng)的動(dòng)態(tài)庫(kù),選擇模擬器就會(huì)編譯出模擬器對(duì)應(yīng)的動(dòng)態(tài)庫(kù).
注意編譯的時(shí)候要配置支持的指令集
armv7|armv7s|arm64都是ARM處理器的指令集(一般為真機(jī)需要的指令集)
i386|x86_64 是iOS模擬器的指令集(也就是電腦CPU的指令集)
arm64:iPhone6s| iphone6s plus|iPhone6| iPhone6 plus|iPhone5S |iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch3G|iPod Touch4
i386:iPhone5| iPhone 4s |iPhone4及前代產(chǎn)品的模擬器
x86_64:iPhone5s| iPhone 6 |...| iPhone8的模擬器
理論上指令集是向下兼容的实蓬,比如連接設(shè)備為arm64挽荡,那么是有可能編譯出的動(dòng)態(tài)庫(kù)所支持的指令集為armv7s或者是armv7晚胡,這個(gè)具體看后面的介紹。但是向下兼容并不是說一個(gè)armv7s的動(dòng)態(tài)庫(kù)可以用在arm64架構(gòu)的設(shè)備上湃番,如果連接的設(shè)備是arm64的,而導(dǎo)入的動(dòng)態(tài)庫(kù)是沒有支持arm64,那么在編譯階段即會(huì)報(bào)錯(cuò)
要想你的動(dòng)態(tài)庫(kù)支持多個(gè)平臺(tái)那么就需要配置編譯選項(xiàng):
Architectures:指明選定Target要求被編譯生成的二進(jìn)制包所支持的指令集
Build Active Architecture Only: 指明是否只編譯當(dāng)前連接設(shè)備所支持的指令集扩淀,如果是,那么只編譯出連接設(shè)備所對(duì)應(yīng)的指令集啤挎,如果否驻谆,則編譯出所有其它有效的指令集(由Architectures和Valid Architectures決定)
Valid Architectures:指明可能支持的指令集并非Architectures列表中指明的指令集都會(huì)被支持
一般情況下我們會(huì)選擇Architectures設(shè)置為?armv7、armv7s庆聘、arm64?Valid Architectures設(shè)置為armv7胜臊、armv7s、arm64 ?Build Active Architecture Only 設(shè)置為NO.
設(shè)置完之后,選擇真機(jī)編譯生成真機(jī)對(duì)應(yīng)的FrameWork ,選擇模擬器編譯生成對(duì)應(yīng)的FrameWork 生成的兩個(gè)FrameWork 分別位于Debug-iphoneos 和Debug-iphonesimulator兩個(gè)文件夾下
ps:使用$lipo -info?{你的FrameWork} 來查看FrameWork支持的指令集
5.生成兩個(gè)FrameWork之后你可以選擇單獨(dú)使用,可以選擇將兩個(gè)FrameWork合并
lipo -create 真機(jī)路徑 模擬器路徑 -output 真機(jī)路徑 這樣就會(huì)合并兩個(gè)FrameWork.并將新合成的FrameWork輸出到真機(jī)路徑下.
將這個(gè)新合成的FrameWork導(dǎo)入到其他工程里就可以使用了.但是記得導(dǎo)入其它工程的時(shí)候記得設(shè)置Embedded Binarise?
否則會(huì)導(dǎo)致系統(tǒng)不能加載該動(dòng)態(tài)庫(kù)
ps:制作靜態(tài)庫(kù)的過程跟動(dòng)態(tài)庫(kù)的過程差別不大,區(qū)別就在于靜態(tài)的庫(kù)的頭文件,不需要導(dǎo)入到公共的頭文件,打包完成之后頭文件和.a文件是分開的,你需要把這個(gè)兩個(gè)都導(dǎo)入工程才能使用.
ps:在xcode6之后,xcode默認(rèn)不支持armv7s指令,編譯出來的庫(kù)可能不支持armv7s指令集.你可以選擇在Architectures選項(xiàng)中手動(dòng)添加armv7s
最后寫個(gè)一個(gè)腳本自動(dòng)幫你合并模擬器和真機(jī)的庫(kù):
if [ "${ACTION}" = "build" ]thenINSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.frameworkif [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fimkdir -p "${INSTALL_DIR}"cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"open "${DEVICE_DIR}"open "${SRCROOT}/Products"fi