编译Android版本的OpenSSL

将android-ndk-r20b和openssl-master解压在同一层目录,在此目录创建脚本bld.sh,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
 
BASE_DIR=/home/sdb/android/ndk-r20b
 
export ANDROID_NDK_HOME=${BASE_DIR}/android-ndk-r20b
 
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
 
cd openssl-master/
 
#./Configure --prefix=${BASE_DIR}/openssl-arm32 android-arm -D__ANDROID_API__=29
./Configure --prefix=${BASE_DIR}/openssl-arm32 android-arm -D__ANDROID_API__=16
#./Configure --prefix=${BASE_DIR}/openssl-x86 android-x86 -D__ANDROID_API__=16
 
make
make install

运行bld.sh脚本就会生成OpenSSL库文件。

openssl vc2017

由于vc2013编译的openssl库用在vc2017的工程中会报LNK2019找不到___iob_func的错误,不得不重新在vc2017下编译openssl库,会到问题如下:

  1. 要先安装ActivePerl和nasm。
  2. openssl不能下载最新的,因为比如gsoap使用的很多结构体都是老openssl里的。因此,我这里还是编译openssl-1.0.1p。
  3. 解压出openssl-1.0.1p目录后,为了防止编译时出现以下错误,
    constant_time_test.obj : error LNK2019 ___iob_func
    先要修改里面的e_os.h如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    #   if defined(_MSC_VER) && !defined(_DLL) && defined(stdin)
    #    if _MSC_VER>=1300
    #if 0			// add here
    #     undef stdin
    #     undef stdout
    #     undef stderr
    FILE *__iob_func();
    #     define stdin  (&__iob_func()[0])
    #     define stdout (&__iob_func()[1])
    #     define stderr (&__iob_func()[2])
    #endif			// add here
    #    elif defined(I_CAN_LIVE_WITH_LNK4049)

    也就是禁止它修改stdin之类的指向__iob_func。
    注意,如果已执行了nmake,再改e_os.h,再nmake是不能自动解决依赖关系重编的。要么删掉openssl-1.0.1p目录,重新解压,要么执行
    nmake -f ms\nt.mak clean

  4. 编译脚本为:

    1
    2
    3
    4
    
    perl Configure VC-WIN32 --prefix=d:\OpenSSL
    ms\do_nasm.bat
    nmake -f ms\nt.mak
    nmake -f ms\nt.mak install

    最终生成的库在d:\OpenSSL里。