目录
一、下载源码
二、编译安装
普通编译安装
交叉编译安装
参数解释
注意事项
三、安装成功示例
四、参考资料
一、下载源码
官网地址: /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,按如下步骤执行命令:
普通编译安装
- ./config --prefix=/home/yourInstallPath/x86 -fPIC no-shared no-asm
- make -j10 && make install
交叉编译安装
- ./config --prefix=/home/yourInstallPath/x3399 -fPIC no-shared no-asm --cross-compile-prefix=aarch64-linux-gnu-
- 打开./config 生成的Makefile,将-m64选项全部删除掉,一共有两处,如果在x86机器进行交叉编译,不删除会报错。
- 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的错误。
三、安装成功示例
从图中可以看出,指定安装路径下的include下生成了头文件,lib下生成了 libcrypto.a 和 libssl.a 两个静态库文件,这样就可以把库文件和头文件应用到自己的工程中去了!
四、参考资料
Linux系统编译Openssl步骤_openssl编译要多久_李柏林的博客
ubuntu - cc1: error: unrecognized command line option "-m64" - SegmentFault 思否