原文網址:https://www.jianshu.com/p/651513cab181ios
本篇文章爲你們推薦兩個腳本,用來iOS系統下編譯OpenSSL通用庫,若是想了解編譯具體過程,請參看《iOS編譯OpenSSL靜態庫》git
說明:
該腳本帶有demo,同窗們能夠研究下源碼,瞭解加密解密的過程。shell
等待下載完成,終端進入文件目錄,執行build-libssl.sh
腳本文件ruby
$ cd .../OpenSSL-for-iPhone-master $ ./build-libssl.sh
等待腳本執行完畢,咱們所需的庫文件就已經編譯好了。bash
下載:https://github.com/gitusrs/openssl-ios-build-shell-script架構
相對於「腳本一」,該腳本就比較清爽了,只是一個OpenSSL編譯腳本,須要同窗們本身下載OpenSSL源碼,將OpenSSL源碼與該腳本放在同一級目錄下,終端進入,執行編譯就能夠了。app
$ cd /xxx/test $ ./openssl-build.sh
【注】 OpenSSL源碼,保持 .tar
的壓縮格式就能夠。若是源碼不是.tar
格式,請修改腳本,解壓文件。iphone
👇下面貼出該腳本源碼以及一些註釋:函數
#!/bin/bash # Created by FangYuan Gui on 13.01.16. # Copyright 2011 FangYuan Gui. All rights reserved. # # Licensed under the Apache License set -u # 壓縮文件名(必須是 .tar 壓縮格式,否則沒法解壓縮) OPENSSL_COMPRESSED_FN="openssl-1.1.0c.tar" #echo "${OPENSSL_COMPRESSED_FN}" # 解壓縮後的文件名(即去掉壓縮後綴 .tar*) OPENSSL_SRC_DIR=${OPENSSL_COMPRESSED_FN//.tar*/} #echo "${OPENSSL_SRC_DIR}" # ${PWD}:當前所在文件目錄 # 編譯目錄 OPENSSL_BUILD_DIR=${PWD}/${OPENSSL_SRC_DIR}-build #echo "${OPENSSL_BUILD_DIR}" # 編譯目錄下的log日誌目錄 OPENSSL_BUILD_LOG_DIR=${OPENSSL_BUILD_DIR}/log #echo "${OPENSSL_BUILD_LOG_DIR}" # 編譯目錄下最後生成通用庫的目錄 OPENSSL_BUILD_UNIVERSAL_DIR=${OPENSSL_BUILD_DIR}/universal #echo "${OPENSSL_BUILD_UNIVERSAL_DIR}" # 通用庫目錄下的lib目錄 OPENSSL_UNIVERSAL_LIB_DIR=${OPENSSL_BUILD_UNIVERSAL_DIR}/lib #echo "${OPENSSL_UNIVERSAL_LIB_DIR}" # 刪除解壓縮後的文件 rm -rf ${OPENSSL_SRC_DIR} rm -rf ${OPENSSL_BUILD_DIR} # 解壓縮tar文件,失敗則退出 tar xfz ${OPENSSL_COMPRESSED_FN} || exit 1 # 建立目錄 if [ ! -d "${OPENSSL_BUILD_UNIVERSAL_DIR}" ]; then mkdir -p "${OPENSSL_BUILD_UNIVERSAL_DIR}" fi if [ ! -d "${OPENSSL_BUILD_LOG_DIR}" ]; then mkdir "${OPENSSL_BUILD_LOG_DIR}" fi if [ ! -d "${OPENSSL_UNIVERSAL_LIB_DIR}" ]; then mkdir "${OPENSSL_UNIVERSAL_LIB_DIR}" fi pushd . # 進入OPENSSL_SRC_DIR目錄 cd ${OPENSSL_SRC_DIR} # 查找 clang 編譯器 目錄 # /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang CLANG=$(xcrun --find clang) # 查找 iPhone SDK 目錄 # /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.1.sdk IPHONE_OS_SDK_PATH=$(xcrun -sdk iphoneos --show-sdk-path) # IPHONE_OS_SDK_PATH 目錄中 SDKs 的上級目錄 # /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer IPHONE_OS_CROSS_TOP=${IPHONE_OS_SDK_PATH//\/SDKs*/} # IPHONE_OS_SDK_PATH 目錄中最後一級目錄 # iPhoneOS10.1.sdk IPHONE_OS_CROSS_SDK=${IPHONE_OS_SDK_PATH##*/} # iPhone 模擬器 sdk 目錄 # /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.1.sdk IPHONE_SIMULATOR_SDK_PATH=$(xcrun -sdk iphonesimulator --show-sdk-path) # IPHONE_SIMULATOR_SDK_PATH 目錄中 SDKs 的上級目錄 # /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer IPHONE_SIMULATOR_CROSS_TOP=${IPHONE_SIMULATOR_SDK_PATH//\/SDKs*/} # IPHONE_SIMULATOR_SDK_PATH 目錄中最後一級目錄 # iPhoneSimulator10.1.sdk IPHONE_SIMULATOR_CROSS_SDK=${IPHONE_SIMULATOR_SDK_PATH##*/} # 須要編譯的架構平臺列表 ARCH_LIST=("armv7" "armv7s" "arm64" "i386" "x86_64") # 須要編譯的平臺數量 ARCH_COUNT=${#ARCH_LIST[@]} # 各架構sdk所在的目錄 CROSS_TOP_LIST=(${IPHONE_OS_CROSS_TOP} ${IPHONE_OS_CROSS_TOP} ${IPHONE_OS_CROSS_TOP} ${IPHONE_SIMULATOR_CROSS_TOP} ${IPHONE_SIMULATOR_CROSS_TOP}) # 各架構sdk名 CROSS_SDK_LIST=(${IPHONE_OS_CROSS_SDK} ${IPHONE_OS_CROSS_SDK} ${IPHONE_OS_CROSS_SDK} ${IPHONE_SIMULATOR_CROSS_SDK} ${IPHONE_SIMULATOR_CROSS_SDK}) # 編譯配置 config_make() { # 接收第一個參數 ARCH=$1; # 接收第二個參數,導入配置文件 export CROSS_TOP=$2 # 接收第三個參數,導入配置文件 export CROSS_SDK=$3 # -miphoneos-version-min選項指定最小支持的iOS版本; # -fembed-bitcode選項開啓bitcode的支持,去掉就不支持bitcode #export CC="${CLANG} -arch ${ARCH} -miphoneos-version-min=6.0 -fembed-bitcode" export CC="${CLANG} -arch ${ARCH} -miphoneos-version-min=6.0" make clean &> ${OPENSSL_BUILD_LOG_DIR}/make_clean.log # 配置編譯條件 echo "configure for ${ARCH}..." if [ "x86_64" == ${ARCH} ]; then # 編譯x86_64平臺的openssl,Configure時須要指定no-asm選項,不然會報錯; ./Configure iphoneos-cross --prefix=${OPENSSL_BUILD_DIR}/${ARCH} no-asm &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-conf.log else ./Configure iphoneos-cross --prefix=${OPENSSL_BUILD_DIR}/${ARCH} &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-conf.log fi # 編譯 echo "build for ${ARCH}..." make &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-make.log make install_sw &> ${OPENSSL_BUILD_LOG_DIR}/${ARCH}-make-install.log # unset命令用於刪除已定義的shell變量(包括環境變量)和shell函數。unset命令不可以刪除具備只讀屬性的shell變量和環境變量。 unset CC unset CROSS_SDK unset CROSS_TOP echo -e "\n" } # 執行config_make()函數,進行配置與編譯 # 傳入三個參數${ARCH_LIST[i]} ${CROSS_TOP_LIST[i]} ${CROSS_SDK_LIST[i]} for ((i=0; i < ${ARCH_COUNT}; i++)) do config_make ${ARCH_LIST[i]} ${CROSS_TOP_LIST[i]} ${CROSS_SDK_LIST[i]} done # 建立lib庫 create_lib() { LIB_SRC=lib/$1 LIB_DST=${OPENSSL_UNIVERSAL_LIB_DIR}/$1 LIB_PATHS=( ${ARCH_LIST[@]/#/${OPENSSL_BUILD_DIR}/} ) LIB_PATHS=( ${LIB_PATHS[@]/%//${LIB_SRC}} ) lipo ${LIB_PATHS[@]} -create -output ${LIB_DST} } create_lib "libssl.a" create_lib "libcrypto.a" cp -R ${OPENSSL_BUILD_DIR}/armv7/include ${OPENSSL_BUILD_UNIVERSAL_DIR} popd rm -rf ${OPENSSL_SRC_DIR} echo "done."
拾遺
壓縮文件名(必須是 .tar 壓縮格式,否則沒法解壓縮)
,這句註釋是有問題的。只要保持源碼壓縮文件名和腳本中引用的文件名一致就能夠。我最開始的【注】中也寫了,若是源碼不是.tar格式,請修改腳本
,後期寫註釋時忽略了,感謝@cwli指出這個問題。