当前位置:   article > 正文

GmSSL2.x编译iOS静态库和Android动态库_gmssl ios

gmssl ios

一、GMSSL-2.5.4

国密SDK源码下载

1.1 cd到SDK源码目录
cd /Users/xxxx/Downloads/GmSSL-main
  • 1
1.2 查看SDK适用环境
./config
  • 1

3c0ce26a5e524d7a883f1c62a136c4e4

上图中错误解决方法

使用文本编辑器打开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
  • 2
  • 3
  • 4
1.3 添加srp.h头文件

Xnip2024-05-11_11-42-22

从包含srp.h头文件的GMSS工程中拷贝srp.h到GmSSL-main–>include–>openssl

1.4 安装GMSSL

有安装需求的才安装,只是编译库文件不必安装GMSSL到电脑

make
  • 1
make test
  • 1
sudo make install
  • 1
  • 查看gmssl版本
gmssl version
  • 1
1.5 卸载GMSSL
  • 查看gmssl安装路径

    which gmssl
    
    • 1

    Xnip2024-05-14_08-52-08

  • 查看openssl安装路径

    which openssl
    
    • 1

    Xnip2024-05-14_08-53-23

  • 删除gmssl安装文件

    rm -rf /user/local/bin/gmssl
    
    • 1
  • 删除openssl安装文件

    rm -rf /user/local/bin/openssl
    
    • 1
  • 删除openssl头文件

    sudo rm -rf /user/local/include/openssl
    
    • 1
1.6 添加新文件参与编译步骤

添加新文件到GmSSL项目目录中,下面以GmSSL–>ssl文件为例

Xnip2024-05-14_09-12-48

  • 新文件引入gmssl头文件格式

    引入格式 #include <openssl/xxx.h>

    如果编写的新文件需要使用到gmssl中的头文件,引入格式是#include <openssl/xxx.h>,否则编译过程中会报找不到头文件的错误。

  • 修改build.info文件

    gmssl项目的每个参与编译的文件夹下都有build.info文件,向build.info中添加需要参与编译的文件路径

    Xnip2024-05-14_09-18-00

二、编译iOS静态库

编译环境准备:Mac电脑,Xcode。

2.1 编译armv7/armv7s架构
  • 清理编译文件
make distclean
  • 1
  • 设置编译器 ,编译armv7s只需将armv7替换成armv7s即可
export CC="clang -arch armv7"
  • 1
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 1
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  • 1
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
  • 1
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 1
  • 生成makefile
./Configure ios-cross no-shared -DGMSSL_NO_TURBO
  • 1
  • 构建
make
  • 1
2.2 编译arm64架构
  • 清理编译文件
make distclean
  • 1
  • 设置编译器
export CC="clang -arch arm64"
  • 1
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 1
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  • 1
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
  • 1
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 1
  • 生成makefile
./Configure ios64-cross no-shared -DGMSSL_NO_TURBO
  • 1
  • 构建
make
  • 1
2.3 编译i386和x86_64
  • 清理编译文件
make distclean
  • 1
  • 设置编译器
export CC="clang -arch i386 -arch x86_64"
  • 1
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 1
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
  • 1
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneSimulator17.2.sdk
  • 1
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 1
  • 生成makefile
./Configure iphoneos-cross no-shared -DGMSSL_NO_TURBO 
  • 1
  • 构建
make
  • 1
2.4 静态库合并
  • 合并命令
lipo -create 模拟器.a文件路径  真机.a文件路径 -output 合成的.a文件路径
  • 1
  • 查看静态库信息
lipo -info  .a文件路径
  • 1

三、编译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版本。

Xnip2024-05-20_13-16-59

安装Ubuntu Desktop版本

Xnip2024-05-20_13-25-41

Xnip2024-05-20_13-30-11

  • 安装apt包管理器
sudo apt update
  • 1

Xnip2024-05-20_14-36-05

  • 安装make工具
sudo apt-get install make
  • 1
  • 安装gcc
sudo apt-get install gcc
  • 1
  • 安装文件共享工具
sudo apt install open-vm-tools open-vm-tools-desktop
  • 1
3.3、添加共享文件夹

Xnip2024-05-20_14-49-12

Xnip2024-05-20_14-51-10

  • Ubuntu使用共享文件夹

共享文件夹一般都在/mnt/hgfs/路径下。

cd /mnt/hgfs
  • 1
  • 查看共享文件夹
ls /mnt/hgfs
  • 1

如果查不到添加的共享文件夹可执行如下命令重新挂载。

sudo mkdir -p /mnt/hgfs
  • 1
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
  • 1
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104

我将编写好的脚本文件命名为and.sh。gmssl2-ubuntu中的文件结构如下:

Xnip2024-05-20_15-07-26

3.5、执行编译脚本

以下所有的编译指令都在Linux系统中执行。编译失败或重新编译架构之前在GmSSL源码的根目录下执行:make distclear

Xnip2024-05-21_16-02-12

  • 添加脚本文件权限
chmod a+x and.sh
  • 1
  • 编译armeabi-v7a
and.sh armeabi-v7a
  • 1
  • 编译arm64-v8a
and.sh arm64-v8a
  • 1
  • 编译x86
and.sh x86
  • 1
  • 编译x86_64
and.sh x86_64
  • 1

编译出来的动态库

Xnip2024-05-20_16-21-18

  • 查看动态库架构
cd /Users/xxxx/Desktop/gmssl2-ubuntu/out/output/lib/armeabi
  • 1
file libcrypto.so
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/654840
推荐阅读
相关标签
  

闽ICP备14008679号