文章轉自:
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靜态庫