iOS编译OpenSSL静态库

下载OpenSSL源码:https://www.openssl.org/source/

  • 进入openssl目录,创建存储openssl编译后的静态库文件夹

    # 用于存储不同架构下,使用openssl编译后的静态资源文件
    $ mkdir openssl_arm64 openssl_armv7 openssl_armv7s openssl_i386 openssl_lib
    

编译 armv7 (armv7、armv7s、arm64)架构库

  1. 生成配置文件

    $ ./Configure iphoneos-cross --prefix=/Users/xxx/openssl-1.1.0c/openssl_armv7 
    

    --prefix=后的参数为编译生成文件的存储路径

  2. 需改配置文件

    执行完步骤1之后,可以发现openssl-x.x.x目录下生成了一些配置文件,文本编辑器打开Makefile文件,修改配置:

    1. 设置编译器

      搜索 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等)

    1. 设置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显示包内容进行查找

  3. 编译openssl

    1. make

      $ make 
      

      终端执行make命令,进行编译

    2. make install
      执行完步骤i后,openssl.x.x.x目录下,生成了libcrypto.alibssl.a等文件。查看我们步骤1设置的路径下,依然空空如也。
      别着急,我们继续执行:

      $ make install
      

      如果执行成功,我们就可以在设置的目录下查看到我们所需要的文件了


      iOS编译OpenSSL静态库_第1张图片
      armv7-build.jpg
  4. 清理编译配置

    编译过程中会产生一些垃圾文件,当我们最终编译成功后,依然会存在。这时候就需要我们及时清理掉,为下个版本的编译做好准备。

    $ make clean
    

编译 i386(i386、x86_64)

  1. 生成配置文件

    $ ./Configure iphoneos-cross --prefix=/Users/xxx/openssl-1.1.0c/openssl_i386 -no-asm 
    

    --prefix=后的参数为编译生成文件的存储路径
    -no-asm:i386采用的不是arm指令集,生成配置文件时,需添加-no-asm参数,否则无法make成功

  2. 需改配置文件

    执行完步骤1之后,可以发现openssl-x.x.x目录下生成了一些配置文件,文本编辑器打开Makefile文件,修改配置:

    1. 设置编译器

      搜索 CC= $(CROSS_COMPILE)cc 替换为

      CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch i386
      

    其中/Applications/.../clang为编译器路径,
    -arch i386 修改为对应的指令集

    1. 设置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版本应该选择模拟器版本

  3. 编译openssl

    1. $ make
    2. $ make install
  4. 清理编译配置

    $ 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
    
  • 最终生成的通用库

iOS编译OpenSSL静态库_第2张图片
universal-lib.jpg

其中openssl头文件,可以任意拷贝某一架构下生成库中的头文件。
e.g.
openssl_armv7/include/openssl

我只是想简单的加个密啊,需要这么麻烦吗别着急,这里为大家推荐两个自动化编译脚本《iOS编译OpenSSL静态库(使用脚本自动编译)》

参考资料

iOS 生成通用 OpenSSL 库

iOS完美自动编译openssl,curl

你可能感兴趣的:(iOS编译OpenSSL静态库)