做armv7 跟i386 都可以用的library

簡單來說,就是把給simulator 還有給device用的.a 檔合併

相關資料有這些:

用了一個很少見的file 指令來做合併,不推薦

寫了一個模組來自動產生,但是有些微調的地方還是不夠

詳細作法,但這篇有點舊 還在ios SDK 3.x


所以....看了一堆對岸同胞的文章,作法簡敘如下:
其實只是這篇文章的中文翻譯



比如說我有一個專案叫做CPI,裡面有一堆檔案,按下build了以後會做出一個叫libCpi.a 的library
  1. 先用實機build一次,應該會build出實機的.a 檔
  2. 切成simulator 再build 一次
  3. add new Target ,選iOS 裡面的Other ,創一個Aggrete ,取一個甲意的專案名 
  4. 去 Build Settings裡面改PRODUCT_NAME ,改成原本build library 的那個專案名:CPI 
  5. 切到 Build Phases,按右下角 Add Build Phase 然後點Add Run Script 
  6. 中間會跑出來讓你填script 的欄位,填入
LIB_TARGET_NAME="CPI"

if [ "${ACTION}" = "clean" ]
then
echo "Cleaning Libraries..."
cd "${PROJECT_DIR}"
xcodebuild -target "$LIB_TARGET_NAME" -configuration ${CONFIGURATION} -sdk iphoneos clean
xcodebuild -target "$LIB_TARGET_NAME" -configuration ${CONFIGURATION} -sdk iphonesimulator clean
fi

if [ "${ACTION}" = "build" ]
then
echo "Building Libraries"
cd "${PROJECT_DIR}"
xcodebuild -target "$LIB_TARGET_NAME" -configuration ${CONFIGURATION} -sdk iphoneos
xcodebuild -target "$LIB_TARGET_NAME" -configuration ${CONFIGURATION} -sdk iphonesimulator

# Check that this is what your static libraries are called
ARM_FILES="${PROJECT_DIR}/build/${CONFIGURATION}-iphoneos/lib${LIB_TARGET_NAME}.a"
I386_FILES="${PROJECT_DIR}/build/${CONFIGURATION}-iphonesimulator/lib${LIB_TARGET_NAME}.a"

mkdir -p "${PROJECT_DIR}/build/Universal"

echo "Creating library..."
lipo -create "$ARM_FILES" "$I386_FILES" -o "${PROJECT_DIR}/build/Universal/lib${PRODUCT_NAME}.a"
fi


重點是第一行要設對,不然會build 錯,或者是Xcode 跑很久,久到睡個覺起來還沒跑好

重點結論,這個script 會在原資料夾下面/build/Universal ,做出一個universal 的library,
之後要用的時候就把.a 檔跟有用到的.h 檔加進專案就好了。


檢查方法如下:
去terminal 打 lipo -info library 的位置,正常的話會出現armv7 跟i386

沒有留言: