目录

一、下载源码

二、编译安装

普通编译安装

交叉编译安装

参数解释

注意事项

三、安装成功示例

四、参考资料 


一、下载源码

官网地址: /index.html 旧的版本下载地址: /source/old/index.html git上下载地址: https://github.com/openssl/openssl/releases

版本解释:

https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_VERSION_NUMBER.html
从文章中 #define OPENSSL_VERSION_NUMBER 0xnnnnnnnnnL  可以看得出版本号共9位数, 
如 0x101010ef 省略了前面的一个0,实际为 0x0101010ef  版本是 OpenSSL 1.1.1n

解析:
0x0101010ef 前面6位的 010101 为 1.1.1
7到8位为 0e 对应字母 n
n的由来如下:
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

第9位代表状态 dev beta release等

二、编译安装

注意:本人所述都是基于:CentOS Linux release 7.4 的操作,其它发行版本不保证一样!

解压源码后,进入解压后的路径,如:cd openssl-1.0.2o,按如下步骤执行命令:

普通编译安装

  1. ./config --prefix=/home/yourInstallPath/x86 -fPIC no-shared no-asm
  2. make -j10 && make install

交叉编译安装

  1. ./config --prefix=/home/yourInstallPath/x3399 -fPIC no-shared no-asm --cross-compile-prefix=aarch64-linux-gnu-
  2. 打开./config 生成的Makefile,将-m64选项全部删除掉,一共有两处,如果在x86机器进行交叉编译,不删除会报错。
  3. make -j10 && make install

参数解释

  • --prefix
  • -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),  则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的;
  • no-shared 表示不生成动态库,只生成静态库,如果想生成动态库使用shared参数(默认应该也是动态库)。no-asm
  • --cross-compile-prefix

注意事项

  • -cross-compile-prefix指定的编译器不是全称,比如我想使用的是aarch64-linux-gnu-gcc,但是执行交叉编译命令时,填写的是aarch64-linux-gnu-,后面的gcc不用写,会自动识别。
  • 上面命令中的yourInstallPath替换成自己想要安装的路径。
  • 如果普通编译和交叉编译先后进行,最好前一种编译后删除源码,再次解压后再进行后一种编译,或者分别解压两次到不同的路径后分别执行不同的编译,因为我遇到过在同一个路径下先编译x86的,完成后make clean,再编译arm的aarch64,会报错一种:error adding symbols: File in wrong format的错误。

三、安装成功示例

openssl Android编译_交叉编译

从图中可以看出,指定安装路径下的include下生成了头文件,lib下生成了 libcrypto.a 和 libssl.a 两个静态库文件,这样就可以把库文件和头文件应用到自己的工程中去了!

四、参考资料 

Linux系统编译Openssl步骤_openssl编译要多久_李柏林的博客

ubuntu - cc1: error: unrecognized command line option "-m64" - SegmentFault 思否