下载OpenSSL源码:https://www.openssl.org/source/
-
进入
openssl
目录,创建存储openssl编译后的静态库文件夹# 用于存储不同架构下,使用openssl编译后的静态资源文件 $ mkdir openssl_arm64 openssl_armv7 openssl_armv7s openssl_i386 openssl_lib
编译 armv7 (armv7、armv7s、arm64)架构库
-
生成配置文件
$ ./Configure iphoneos-cross --prefix=/Users/xxx/openssl-1.1.0c/openssl_armv7
--prefix=
后的参数为编译生成文件的存储路径 -
需改配置文件
执行完步骤1之后,可以发现
openssl-x.x.x
目录下生成了一些配置文件,文本编辑器打开Makefile
文件,修改配置:-
设置编译器
搜索
CC= $(CROSS_COMPILE)cc
替换为CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7
其中
/Applications/.../clang
为编译器路径,
-arch armv7
为本次编译的指令集(即:armv7、armv7s、arm64等)-
设置sdk路径
在
CC= $(CROSS_COMPILE)cc
的下一行,我们可以发现CFLAGS
的参数设置CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common
其中
-isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK)
参数为sdk路径,添加路径参数:# sdk上层路径 CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer # sdk文件 CROSS_SDK=iPhoneOS10.1.sdk # 源配置,不需要改动 CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common
【注】 sdk的实际路径可以通过Xcode显示包内容进行查找
-
-
编译openssl
-
make
$ make
终端执行
make
命令,进行编译 -
make install
执行完步骤i后,openssl.x.x.x
目录下,生成了libcrypto.a
、libssl.a
等文件。查看我们步骤1设置的路径下,依然空空如也。
别着急,我们继续执行:$ make install
如果执行成功,我们就可以在设置的目录下查看到我们所需要的文件了
-
-
清理编译配置
编译过程中会产生一些垃圾文件,当我们最终编译成功后,依然会存在。这时候就需要我们及时清理掉,为下个版本的编译做好准备。
$ make clean
编译 i386(i386、x86_64)
-
生成配置文件
$ ./Configure iphoneos-cross --prefix=/Users/xxx/openssl-1.1.0c/openssl_i386 -no-asm
--prefix=
后的参数为编译生成文件的存储路径
-no-asm
:i386采用的不是arm指令集,生成配置文件时,需添加-no-asm
参数,否则无法make成功 -
需改配置文件
执行完步骤1之后,可以发现
openssl-x.x.x
目录下生成了一些配置文件,文本编辑器打开Makefile
文件,修改配置:-
设置编译器
搜索
CC= $(CROSS_COMPILE)cc
替换为CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch i386
其中
/Applications/.../clang
为编译器路径,
-arch i386
修改为对应的指令集-
设置sdk路径
在
CC= $(CROSS_COMPILE)cc
的下一行,我们可以发现CFLAGS
的参数设置CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common
其中
-isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK)
参数为sdk路径,添加路径为:# sdk上层路径 CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer # sdk文件 CROSS_SDK=iPhoneSimulator10.1.sdk # 源配置,不需要改动 CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common
【注】此处的sdk版本应该选择模拟器版本
-
-
编译openssl
$ make
$ make install
-
清理编译配置
$ make clean
合并成通用库
-
合并
libssl.a
$ lipo -create openssl_arm64/lib/libssl.a openssl_armv7/lib/libssl.a openssl_armv7s/lib/libssl.a openssl_i386/lib/libssl.a openssl_x86_64/lib/libssl.a -output openssl_lib/libssl.a
-
合并
libcrypto.a
$ lipo -create openssl_arm64/lib/libcrypto.a openssl_armv7/lib/libcrypto.a openssl_armv7s/lib/libcrypto.a openssl_i386/lib/libcrypto.a openssl_x86_64/lib/libcrypto.a -output openssl_lib/libcrypto.a
-
查看合并库的架构信息
$ lipo -info libcrypto.a $ lipo -info libssl.a
最终生成的通用库
其中openssl头文件,可以任意拷贝某一架构下生成库中的头文件。
e.g.
openssl_armv7/include/openssl
我只是想简单的加个密啊,需要这么麻烦吗😤别着急,这里为大家推荐两个自动化编译脚本《iOS编译OpenSSL静态库(使用脚本自动编译)》
参考资料