编译环境为:MacOS
OpenSSL的源代码:各个版本的下载:https://www.openssl.org/source/old/
编译步骤:和编译ffmpeg差不多:
1)配置编译工具和platform:
这个地址的:https://wiki.openssl.org/images/7/70/Setenv-android.sh
中的Setenv-android.sh其实就只是配置编译工具和platform
Andorid Studio NDK开发-编译OpenSSL类库 - 简书把这个脚本的使用介绍的很清楚
2)configure裁剪
下面是编译openssl-1.1.0g的一个脚本示范:源码和.sh脚本在同一级目录下即可
3)./configure生成makeFile
make执行makeFile且生产二进制文件
make install 打包安装生成的二进制文件到prefix路径下
脚本如下:
#源码 文件夹名字 根据具体的修改
SOURCE="openssl-1.1.0g"
#CPU架构
ARCH=arm
#编译工具和Platform设置
if [ "$ARCH" = "arm" ]; then
HOST=arm-linux-androideabi
SYSROOT=$NDK_PATH/platforms/android-14/arch-arm #platform路径,设置成你的路径
EXFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -ffast-math"
ARCHTARG=arm
CROSS=arm-linux-androideabi
HOSTNAME=arm
COMPILER=android-armeabi
elif [ "$ARCH" = "arm64-v8a" ]; then
HOST=aarch64-linux-android
SYSROOT=$NDK_PATH/platforms/android-24/arch-arm64
ARCHTARG=arm64
CROSS=aarch64-linux-android
HOSTNAME=aarch64
COMPILER=android64-aarch64
elif [ "$ARCH" = "x86" ]; then
HOST=x86
SYSROOT=$NDK_PATH/platforms/android-14/arch-x86
ARCHTARG=x86
CROSS=i686-linux-android
HOSTNAME=x86
COMPILER=android-x86
elif [ "$ARCH" = "x86_64" ]; then
HOST=x86_64
SYSROOT=$NDK_PATH/platforms/android-24/arch-x86_64
ARCHTARG=x86_64
CROSS=x86_64-linux-android
HOSTNAME=x86_64
COMPILER=android64
fi
TOOLCHAIN=$NDK_PATH/toolchains/${HOST}-4.9/prebuilt/darwin-x86_64/bin/${CROSS} #编译工具路径 设置成你的路径
#android_NDK
export NDK_PATH
#android_Platform
export SYSROOT
#android_tools
export CC=${TOOLCHAIN}-gcc #c工具
export CXX=${TOOLCHAIN}-g++ #c++工具
export LD=${TOOLCHAIN}-ld #ld工具
export STRIP=${TOOLCHAIN}-strip #strip工具
export AR=${TOOLCHAIN}-ar #ar工具
export NM=${TOOLCHAIN}-nm #nm工具
export RANLIB=${TOOLCHAIN}-ranlib # ranlib工具
export CFLAGS="${CFLAGS} ${EXFLAGS}"
cd "$SOURCE"
#裁剪 根据具体需求进行裁剪 prefix修改成你的安装路径
./Configure $COMPILER no-shared \
no-ssl2 \
no-comp no-asm no-idea \
no-hw no-engine no-dso \
--prefix=/Users/feng/third-lib/openssl/android/${COMPILER} \
--sysroot=${SYSROOT}
#clean
make clean
#make
make -j4
#install安装
make install
详细说明:参考资料:《OpenSSLWIKI》
1.COMPILER
./configure 里面一定要添加这个,否则会报错
2.Configure & Config
在mac OSx上编译,sh脚本里面写的只能是configure
config编译报错,如下:
ar: crypto/x509v3/v3err.o: No such file or directory
ar: crypto/x86_64cpuid.o: No such file or directory
make[1]: *** [libcrypto.a] Error 1
make: *** [all] Error 2
Fengs-MacBook-Pro:2_openssl feng$
但是查看编译选项必须是:./config --help
./configure --help报错,提示Unix-ish systems必须使用./config,如下:
Fengs-MacBook-Pro:2_openssl feng$ cd openssl-1.1.0g
Fengs-MacBook-Pro:openssl-1.1.0g feng$ ./configure --helpConfiguring OpenSSL version 1.1.0g (0x1010007fL) no-asan
……
NOTE: If in doubt, on Unix-ish systems use './config'.
Fengs-MacBook-Pro:openssl-1.1.0g feng$
3)Dependencies
看到有的脚本,在make 之前有个make depend,depend的意思是编译依赖库。这个是非必须的。如果 OpenSSL 1.0.2 和低于这个版本的需要make之前make depend,即:
./Configure .......#configure自己配置 此处省略
make clean
make depend
make -j4
make install
如果是OpenSSL 1.1.0和更高版本的是不需要的,只需要make之前clean就好,确保reconfig是最新的。即:
./Configure .......#configure自己配置 此处省略
make clean
make -j4
make install
2)Configure Options
A)压缩库
zlib #使用静态的zlib压缩库
zlib-dynamic #使用动态的zlib压缩
no-zlib #不使用zlib压缩功能
B)多线程
threads #支持多线程的库,默认支持
no-threads #不支持多线程的库
C)动态连接库
shared #生成动态连接库 static静态库默认生成
no-shared #不生成动态连接库
D)汇编代码加快编译
asm #编译过程中使用汇编代码加快编译过程
no-asm #编译过程中不使用汇编代码加快编译过程
E)SSE2指令集加速。如果你的CPU支持SSE2指令集,就可以打开,否则就要关闭
enable-sse2 #启用SSE2
no-sse2 #禁用SSE2
F)GMP库
gmp # 启用GMP库
no-gmp #禁用GMP库
G)X509v3证书的IP地址扩展
rfc3779 #启用X509v3证书的IP地址扩展
no-rfc3779 #禁用X509v3证书的IP地址扩展
H)Kerberos 5 支持
krb5 #启用Kerberos 5 支持
no-krb5 #禁用Kerberos 5 支持
I)SSL(包含了SSL2/SSL3) TLS 协议支持
ssl # 启用ssl
no-ssl # 禁用ssl
ssl2 # 启用ssl2
no-ssl2 # 禁用ssl2
ssl3 # 启用ssl3
no-ssl3 # 禁用ssl3
tls # 启用xls
no-tls # 禁用xls
https的加密请求就需要启用ssl和tls
J)调用其它动态链接库的功能
dso #启用
no-dso #禁用
[提示]no-dso仅在no-shared的前提下可用。
K)调试模式
-d
默认是禁用的,没有使用no -O3 or similar和libefence,如果需要使用调试模式,需要使用apt-get install electric-fence 或者使用yams 安装 brew install electric-fence
L)
enable-ec_nistp_64_gcc_128 #当GCC支持__uint128_t时,在小的endian平台上使用。ECDH的速度快2到4倍。默认情况下不启用,因为Configure无法确定它。如果您的编译器定义了__SIZEOF_INT128__,则CPU是小的endian,它可以容忍未对齐的数据访问
enable-capieng #windows平台上使用
no-hw #禁用硬件支持,移动设备一定要加上 iOS/android
no-engine #禁用硬件支持,移动设备一定要加上 iOS/android
no-dtls # 在OpenSSL 1.1.0 和以上版本禁用dtls
no-dtls1 # 在OpenSSL 1.0.2 和以下版本禁用dtls1
M)禁用选项
a)摘要算法
no-md2,no-md4,no-mdc2,no-ripemd
b)对称加密算法
no-des,no-rc2,no-rc4,no-rc5,no-idea,no-bf,no-cast,no-camellia
c)不对称加密算法
no-ec,no-dsa,no-ecdsa,no-dh,no-ecdh
d)数据压缩算法
no-comp
P)对象存储功能
no-store
4)PREFIX and OPENSSLDIR
这两个参数 都是安装路径射者,但OpenSSL 1.0.2 and below,和OpenSSL 1.1.0 and above版本是有区别的
OpenSSL 1.0.2 and below
通常没必要指定 --prefix,没有指定--prefix会使用--openssl,如果都--openssl也没有指定,会使用默认路径:/usr/local/ssl
最好指定安装路径
OpenSSL 1.1.0 and above
这个版本wiki上说最好--prefix 和 --openssl两个都指定,默认使用/usr/local/ssl
但是我只指定了--prefix,好像也没有什么
5)OPENSSL_init_ssl 和 SSL_library_init
初始化ssl
OpenSSL 1.0.2 and below使用的是SSL_library_init
OpenSSL 1.1.0 and above之后是没有SSL_library_init这个函数而是使用OPENSSL_init_ssl
所以当ffmpeg链接OpenSSL时要特别注意,可以参考我另外一篇文章:
网友评论