iOS编译OpenSSL静态库

作者: 木子_礼 | 来源:发表于2016-12-04 17:26 被阅读1155次

    下载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
        

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


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

    universal-lib.jpg

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

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

    参考资料

    iOS 生成通用 OpenSSL 库

    iOS完美自动编译openssl,curl

    相关文章

      网友评论

      • 往南渡:有没有编好的openssl 支持bitcode的分享下

      本文标题:iOS编译OpenSSL静态库

      本文链接:https://www.haomeiwen.com/subject/fvvhmttx.html