一、GMSSL-2.5.4
1.1 cd到SDK源码目录
cd /Users/xxxx/Downloads/GmSSL-main
1.2 查看SDK适用环境
./config
上图中错误解决方法
使用文本编辑器打开SDK目录下Configure、test/build.info、test/run_tests.pl。
use if $^O ne "VMS", "File::Glob" => qw/glob/;
改为
use if $^O ne "VMS", "File::Glob" => qw/:glob/;
1.3 添加srp.h头文件
从包含srp.h头文件的GMSS工程中拷贝srp.h到GmSSL-main-->include-->openssl
1.4 安装GMSSL
有安装需求的才安装,只是编译库文件不必安装GMSSL到电脑
make
make test
sudo make install
- 查看gmssl版本
gmssl version
1.5 卸载GMSSL
-
查看gmssl安装路径
which gmssl
-
查看openssl安装路径
which openssl
-
删除gmssl安装文件
rm -rf /user/local/bin/gmssl
-
删除openssl安装文件
rm -rf /user/local/bin/openssl
-
删除openssl头文件
sudo rm -rf /user/local/include/openssl
1.6 添加新文件参与编译步骤
添加新文件到GmSSL项目目录中,下面以GmSSL-->ssl文件为例
-
新文件引入gmssl头文件格式
引入格式 #include <openssl/xxx.h>
如果编写的新文件需要使用到gmssl中的头文件,引入格式是#include <openssl/xxx.h>,否则编译过程中会报找不到头文件的错误。
-
修改build.info文件
gmssl项目的每个参与编译的文件夹下都有build.info文件,向build.info中添加需要参与编译的文件路径
二、编译iOS静态库
编译环境准备:Mac电脑,Xcode。
2.1 编译armv7/armv7s架构
- 清理编译文件
make distclean
- 设置编译器 ,编译armv7s只需将armv7替换成armv7s即可
export CC="clang -arch armv7"
- 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
- 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
- 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
- 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
- 生成makefile
./Configure ios-cross no-shared -DGMSSL_NO_TURBO
- 构建
make
2.2 编译arm64架构
- 清理编译文件
make distclean
- 设置编译器
export CC="clang -arch arm64"
- 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
- 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
- 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
- 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
- 生成makefile
./Configure ios64-cross no-shared -DGMSSL_NO_TURBO
- 构建
make
2.3 编译i386和x86_64
- 清理编译文件
make distclean
- 设置编译器
export CC="clang -arch i386 -arch x86_64"
- 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
- 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
- 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneSimulator17.2.sdk
- 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
- 生成makefile
./Configure iphoneos-cross no-shared -DGMSSL_NO_TURBO
- 构建
make
2.4 静态库合并
- 合并命令
lipo -create 模拟器.a文件路径 真机.a文件路径 -output 合成的.a文件路径
- 查看静态库信息
lipo -info .a文件路径
三、编译Android动态库
编译环境:Mac电脑,NDK,Linux系统。
3.1、下载安卓NDK
下载NDK到本地,选择一个比较新的版本下载即可,我选择的是android-ndk-r17c-linux-x86_64.zip。
3.2、安装Linux系统
Android动态库必须在Linux系统下编译,因此需要在Mac电脑上安装虚拟机,我选择的是ubuntu系统。
- 安装VMware Fusion虚拟机Mac版
下载破解版VMware Fusion,然后安装软件到电脑。
- 安装Linux系统
前往Ubuntu官网下载带有桌面GUI的Ubuntu版本。
安装Ubuntu Desktop版本
- 安装apt包管理器
sudo apt update
- 安装make工具
sudo apt-get install make
- 安装gcc
sudo apt-get install gcc
- 安装文件共享工具
sudo apt install open-vm-tools open-vm-tools-desktop
3.3、添加共享文件夹
- Ubuntu使用共享文件夹
共享文件夹一般都在/mnt/hgfs/路径下。
cd /mnt/hgfs
- 查看共享文件夹
ls /mnt/hgfs
如果查不到添加的共享文件夹可执行如下命令重新挂载。
sudo mkdir -p /mnt/hgfs
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
3.4、编写编译脚本
脚本中的gmssl2-ubuntu为共享文件夹,添加共享文件夹的步骤请参考3.3章节,将编写好的脚本文件、NDK、GmSSL的源码放在gmssl2-ubuntu中。
#!/bin/bash
# Define paths and environment variables
# 获取脚本当前所在路径
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# 获取GmSSL源码路径
GMSSL_DIR=$CURRENT_PATH/GmSSL2.5.4
# 取脚本执行的第一个参数
ANDROID_TARGET_ABI=$1
# 获取NDK路径
ANDROID_PATH=/mnt/hgfs/gmssl2-ubuntu/android-ndk-r17c
# 适配最低版本
PLATFORM_VERSION=21
MAKE_TOOLCHAIN=$ANDROID_PATH/build/tools/make-standalone-toolchain.sh
export TOOLCHAIN_PATH=$ANDROID_PATH/toolchains
$MAKE_TOOLCHAIN --arch=arm --platform=android-$PLATFORM_VERSION --install-dir=$TOOLCHAIN_PATH
if [ "$ANDROID_TARGET_ABI" == "armeabi-v7a" ]
then
#armv7:armv7a(32位)
export MACHINE=armv7
#armv7:android
export SYSTEM=android
#armv7:arm
export ARCH=arm
# ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
outdir=armeabi-v7a
# ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
architecture=android-armeabi
export TOOL_BASENAME=$TOOLCHAIN_PATH/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi
export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-arm -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/arm-linux-androideabi"
elif [ "$ANDROID_TARGET_ABI" == "arm64-v8a" ]
then
#armv8:arm64(64位)
export MACHINE=armv8
#armv8:android-v8
export SYSTEM=android-v8
#armv8:aarch64
export ARCH=aarch64
# ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
outdir=arm64-v8a
# ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
architecture=android64-aarch64
export TOOL_BASENAME=$TOOLCHAIN_PATH/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android
export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-arm64 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/aarch64-linux-android"
elif [ "$ANDROID_TARGET_ABI" == "x86" ]
then
# ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
outdir=x86
# ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
architecture=android-x86
export TOOL_BASENAME=$TOOLCHAIN_PATH/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android
export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-x86 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/i686-linux-android"
elif [ "$ANDROID_TARGET_ABI" == "x86_64" ]
then
# ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
outdir=x86_64
# ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
architecture=android64
export TOOL_BASENAME=$TOOLCHAIN_PATH/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android
export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-x86_64 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/arch-x86_64"
else
echo "Unsupported target ABI: $ANDROID_TARGET_ABI"
exit 1
fi
export CC=$TOOL_BASENAME-gcc
export CXX=$TOOL_BASENAME-g++
export LD=$TOOL_BASENAME-ld
export LINK=$CXX
export AR=$TOOL_BASENAME-ar
export RANLIB=$TOOL_BASENAME-ranlib
export STRIP=$TOOL_BASENAME-strip
# Navigate to OpenSSL directory
cd ${GMSSL_DIR}
# Configure with sysroot and prefix
./Configure ${architecture} -D__ANDROID_API__=$PLATFORM_VERSION no-asm no-unit-test no-serpent
# Build OpenSSL
make
# Copy the outputs
OUTPUT_INCLUDE=$CURRENT_PATH/output/include
OUTPUT_LIB=$CURRENT_PATH/output/lib/${outdir}
mkdir -p $OUTPUT_INCLUDE
mkdir -p $OUTPUT_LIB
cp -RL include/openssl $OUTPUT_INCLUDE
cp libcrypto.so $OUTPUT_LIB
cp libcrypto.a $OUTPUT_LIB
cp libssl.so $OUTPUT_LIB
cp libssl.a $OUTPUT_LIB
我将编写好的脚本文件命名为and.sh。gmssl2-ubuntu中的文件结构如下:
3.5、执行编译脚本
以下所有的编译指令都在Linux系统中执行。编译失败或重新编译架构之前在GmSSL源码的根目录下执行:make distclean
- cd到gmssl2-ubuntu目录
cd /mnt/hgfs/gmssl2-ubuntu
- 添加脚本文件权限
chmod a+x and.sh
- 编译arm64-v8a
./and.sh arm64-v8a
- 编译armeabi-v7a
./and.sh armeabi-v7a
- 编译x86
./and.sh x86
- 编译x86_64
./and.sh x86_64
编译出来的动态库
- 查看动态库架构
cd /Users/xxxx/Desktop/gmssl2-ubuntu/out/output/lib/armeabi
file libcrypto.so