天天看點

編譯ios平台的支援arm64和x86_64的通用openssl靜态庫

文章轉自:

ios 編譯openssl支援arm64,但對于原文有所修改,并增加了x86_64的編譯。

對于x86_64,wiki上有這句話:

x86-64 (also known as x64, x86_64 and AMD64) is the 64-bit version of the x86 instruction set. 

也就是說是64位的x86指令集。可以這樣了解armv7 , armv7s對應真機的32位處理器,i386對應模拟器的32位模拟器;arm64對應真機的64位模拟器,x86_64對應模拟器的64位模拟器。

下面是具體的編譯步驟:

先下載下傳openssl的源檔案的最新版本

http://www.openssl.org/source/

在openssl-1.0.1h目錄下建立5個檔案夾,分别為arm64,armv7,armv7s,i386 , x86_64。它們分别用于存放指定平台的庫檔案。

****編譯i386平台

打開/openssl-1.0.1h/crypto/ui/ui_openssl.c進行修改,将

static volatile sig_atomic_t intr_signal; 

修改為

static volatile int intr_signal;

打開終端,進入到openssl-1.0.1h目錄,輸入指令

./configure BSD-generic32 --openssldir=/Users/Kyo/Desktop/openssl-1.0.1h/i386

(/Users/Kyo/Desktop/openssl-1.0.1h/i386為上面建立的i386檔案夾路徑)

指令完成後,在openssl-1.0.1h目錄下會生成很多檔案,找到其中的makefile檔案并打開,

編輯 makefile 檔案,将

CC= gcc

修改為

CC= gcc -arch i386

在下一行CFLAG = ......的最後增加

-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk

(将紅色部分替換為你自己的sdk路徑)

在終端執行指令

make

再接着執行指令

make install

執行完成後,在i386檔案夾下将會生成多個檔案和檔案夾,/lib目錄下存放着編譯成功的庫檔案libcrypto.a 和 libssl.a 

****編譯其它平台

接着我們需要編譯其它平台的庫檔案,先在終端執行指令make clean 清空之前的配置和緩存(發現執行這個指令并不能完成清空,我的做法是,先儲存上面生成的i386的庫檔案,執行make clean指令,然後删除整個openssl-1.0.1h,重新解壓一個openssl-1.0.1h,然後再繼續其它平台的庫檔案編譯)

既然是新解壓的openssl-1.0.1h,我們需要重新上面的幾個步驟,修改ui_openssl.c,執行configure指令,修改makefile檔案。

修改makefile跟i386中有所不同,

CC= gcc

修改為

CC= gcc -arch armv7

(其中armv7是指編譯armv7平台下的庫檔案,如果改為arm64,就是編譯arm64平台下的庫檔案)

在下一行CFLAG = ......的最後增加

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk -miphoneos-version-min=6.0

(i386中的路徑是iPhoneSimulator.platform,而其它架構都是iPhoneOS.platform,請注意x86_64是用iPhoneSimulator.platform的sdk)

在終端執行指令

make

再接着執行指令

make install

執行完成後,在armv7檔案夾下将會生成多個檔案和檔案夾,/lib目錄下存放着編譯成功的庫檔案libcrypto.a 和 libssl.a

如此重複生成各個平台的庫檔案後,開始合并操作。

****制作“通用”靜态庫

執行終端指令合并 libcrypto.a 庫(確定終端中的路徑正确):

lipo -create  /x86_64/lib/libcrypto.a /i386/lib/libcrypto.a  /armv7/lib/libcrypto.a /armv7s/lib/libcrypto.a /arm64/lib/libcrypto.a -output /libcrypto.a

(紅色部分替換為各個.a檔案的路徑,綠色部分替換為最終合并結果的輸出路徑)

執行終端指令合并 libssl.a 庫(確定終端中的路徑正确):

lipo -create /x86_64/lib/libssl.a /i386/lib/libssl.a /armv7/lib/libssl.a /armv7s/lib/libssl.a /arm64/lib/libssl.a -output /libssl.a

(跟前面一樣,将路徑修改為正确路徑)

最後附上我的編譯結果:ios平台的支援arm64和x86_64的通用openssl靜态庫