Mac下编译openssl库

时间:2022-10-22 00:19:05

1、下载OpenSSL源代码库:

http://www.openssl.org/source/

当前最新版本1.0.2c ,笔者下载的是openssl-1.0.2a 下载后,将其中的 openssl-1.0.2a 目录解压出来放在你Mac机器(虚拟机)合适的地方,比如/Users/xx/oo/OpenSSL/openssl-1.0.2a


2、编译OpenSSL

openssl是一个c语言函数库,为方便在Xcode中使用,我们需要把它编译为静态库。

打开crypto/ui/ui_openssl.c进行编辑。

static volatile sig_atomic_t intr_signal;

 

修改为:

static volatile int intr_signal;

否则会出现一个编译错误。


切换到/Users/xx/oo/OpenSSL目录,在其下建立5个子目录(通过图形界面操作也行,看个人偏好了)

mkdir armv7 armv7s arm64 i386 fat

其中armv7 armv7s arm64 i386这四个目录分别用于存放编译的armv7 armv7s arm64 i386版本的静态库,他们之间的版本区别不必赘述,不懂的可以自行查阅,而fat目录用于存放“通用”静态库,也就是包含armv7 armv7s arm64 i386这四种版本的静态库(合并)

Mac下编译openssl库

2.1 编译 i386 版本的静态库(供模拟器使用)

命令行进入openssl-1.0.2a目录,执行目录下的congfigure:

./configure BSD-generic32 --openssldir=/Users/xx/oo/OpenSSL/i386

这句话的意思是配置输出目录,openssldir=/Users/xx/oo/OpenSSL/i386目录既是编译的.a存放目录,也就是前面创建的目录(请填写正确的绝对路径)


接下来需要配置编译选项:

找到openssl-1.0.2a目录下的 makefile 文件,使用文本编译工具打开,找到:

CC= gcc

修改为:

CC= /Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/

usr/bin/clang -arch i386

这句话的意思就是指定编译为i386版本,其中/Applications/XCode.app/Contents/Developer/Toolchains/

XcodeDefault.xctoolchain/usr/bin/clang 是约定俗成的,可以理解为Xcode编译脚本,但路径一定要正确,需要根据你实际的Xcode安装路径来指定(如果你不确定,可以通过Mac的终端工具逐层的去查看)

(下一行)在CFLAG = 的-isysroot参数后面改为你的Mac机器当前Xcode使用的SDK路径,比如笔者的SDK路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/

Developer/SDKs/iPhoneOS8.2.sdk

完整的CFLAG选项类似于但不限于如下:

CFLAG= -DOPENSSL_THREADS -pthread -D_THREAD_SAFE -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -O3 -fomit-frame-pointer -Wall -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/

Developer/SDKs/iPhoneOS8.2.sdk

 

编译选项配置好了,即可进行编译:

make

make install

编译无误且编译完毕之后,检查i386/lib目录下 libcrypto.a 和 libssl.a 是否生成:

Mac下编译openssl库

2.2 编译 armv7 库(armv7架构的iOS使用)

可以先将编译好的 i386 库保存到另外一个目录下面,以免下面的操作可能会将其清除

清除上次编译的配置:

make clean

 

执行configure,重新生成新的编译配置:

./configure BSD-generic32 --openssldir=/Users/xx/oo/OpenSSL/armv7

 

修改 makefile 文件,将 CC=gcc修改为:

CC= /Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/

usr/bin/clang -arch armv7

同样,需要在CFLAG=-isysroot参数后面改为你的Mac机器当前Xcode使用的SDK路径

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

Developer/SDKs/iPhoneOS8.2.sdk

注意,这里是iPhoneOS.platform而不是先前的 iPhoneSimulator.platform了。

编译:

make

make install

编译无误且编译完毕之后,检查armv7/lib目录下 libcrypto.a 和 libssl.a 是否生成


2.3 编译 armv7s 库(armv7s 架构的 iOS 使用)

清除前面编译配置:

make clean

 

执行configure配置编译环境:

./configure BSD-generic32 --openssldir=/Users/xx/oo/OpenSSL/armv7s

 

修改 makefile 文件,将 CC=cc修改为:

CC= /Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/

usr/bin/clang -arch armv7s

 

同样,需要在CFLAG=的-isysroot参数后面改为你的Mac机器当前Xcode使用的SDK路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

Developer/SDKs/iPhoneOS8.2.sdk

 

编译:

make make

install

编译无误且编译完毕之后,检查armv7s/lib目录下 libcrypto.a 和 libssl.a 是否生成:

Mac下编译openssl库

2.4 编译 armv64 库(armv64 架构的 iOS 使用)

清除前面编译配置:

make clean

 

执行configure配置编译环境:

./configure BSD-generic32 --openssldir=/Users/xx/oo/OpenSSL/arm64

 

修改 makefile 文件,将 CC=cc修改为:

CC= /Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/

usr/bin/clang -arch arm64

 

同样,需要在CFLAG=的-isysroot参数后面改为你的Mac机器当前Xcode使用的SDK路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

Developer/SDKs/iPhoneOS8.2.sdk

 

编译:

make make

install

编译无误且编译完毕之后,检查arm64/lib目录下 libcrypto.a 和 libssl.a 是否生成。


2.5 制作“通用”静态库

    通用静态库是一个“多架构”文件,它是多个单一架构静态库的融合。

    这么做的目的是为了避免很多不必要的由于版本差异带来的项目属性设置麻烦。比如说你的某一个工程引用了openssl,当编译armv7架构的时候,需要修改Build Settings属性下的Library Search Paths为armv7架构的libcrypto.a/libssl.a所在的目录,并且在Build Phases属性中的Link Binary With Libraries指定armv7架构的libcrypto.a/libssl.a;倘若你要进行模拟器调试呢?亦或编译支持armv7、armv7s、arm64架构的发布程序呢?

因此,为了避免这些由于架构本身带来的属性设置麻烦,制作“通用”静态库是很有必要的,你仅需要对Library Search Paths、Link Binary With Libraries属性设置一遍,而不管你编译任何架构的目标程序,都不会有任何影响!


制作“通用”静态库需要使用 Mac OS X 的 lipo 命令(具体请参考 Mac OS X 手册)。

合并 libcrypto.a 库:

lipo -create i386/lib/libcrypto.a armv7/lib/libcrypto.a armv7s/lib/libcrypto.aarm64/lib/libcrypto.a -output fat/libcrypto.a

以上请操作请注意相关.a文件的路径,笔者默认当前目录就是/Users/xx/oo/OpenSSL 

查看合并后的libcrypto.a静态库信息(使用lipo -info命令):

Mac下编译openssl库


合并 libssl.a 库略: