相關內容:
重要
用編譯方法2編譯出的庫,集成到工程之后,發現報 incompatible target
錯誤,各種找不到定義。32位和64位都不行。 如果你也遇到跟我一樣的問題。 只能用下面的方法重新編譯
編譯方法1:
編譯環境
- gmssl 2.5.4
- OpenSSL 1.1.0d
- wsl ubuntu 20.04
- ndk-r21e
參考:
NDK開發 - 使用GMSSL庫和OpenSSL庫的注意點及編譯
GmSSL的編譯和使用
腳本參考:https://github.com/wangp8895/gmssl-for-android
編譯中間出現下面的報警
原因是根據獨立工具鏈(已棄用) 的說明,從r19開始,已棄用獨立工具鏈。可以不用管
由於編譯出很多文檔,耗時比較長,可能要1-2小時。將編譯腳本放到解壓后的GmSSL-master同級目錄,使用./build-gmssl4android.sh android64-aarch64
啟動編譯,在你指定的out/libs目錄中, 會生成以下文件:
lib包含:
這次終於可以正常使用了。
編譯方法2:
編譯環境
- wsl ubuntu 20.04
- ndk-r21b
官方給出了一個編譯腳本, 可以稍微參考一下,我是沒編譯通過。
以下為編譯腳本, 參考地址
#!/bin/bash
set -ex
# Set directory
CURRENT_PATH=`pwd`
SCRIPTPATH=$CURRENT_PATH/out
export NDK=/mnt/e/Android/android-ndk-r21b
export OPENSSL_DIR=$CURRENT_PATH
# Find the toolchain for your build machine
toolchains_path=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Configure the OpenSSL environment, refer to NOTES.ANDROID in OPENSSL_DIR
# Set compiler clang, instead of gcc by default
CC=clang
# Add toolchains bin directory to PATH
PATH=$toolchains_path/bin:$PATH
# Set the Android API levels
ANDROID_API=21
# Set the target architecture
# Can be android-armeabi, android64-aarch64, android-x86, android-x86 etc
# armeabi-v7a
outdir=arm64-v8a
# android-armeabi
architecture=android64-aarch64
# Create the make file
cd ${OPENSSL_DIR}
./Configure ${architecture} -D__ANDROID_API__=$ANDROID_API no-asm no-unit-test no-serpent
#./config no-ssl2 no-ssl3 no-comp no-hw no-engine \
#--openssldir=$(pwd)/../out/$ANDROID_API \
#--prefix=$(pwd)/../out/$ANDROID_API
# Build
make -j4
# Copy the outputs
OUTPUT_INCLUDE=$SCRIPTPATH/output/include
OUTPUT_LIB=$SCRIPTPATH/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
配置信息:
生成的Makefile中交叉編譯配置:
這里我嘗試后,編譯器和TOOLCHAIN_PATH不設置也能編譯成功。在目標目錄下會生成include 和lib文件
你可能會遇到的其他問題:
- make發現找不到 asm/types.h
然后發現 sysroot/usr/include下並沒有asm目錄,只有asm-generic。 我發現在include的arm-linux-androideabi下是存在asm目錄的。 所以想法就是將這個目錄添加到搜索頭文件中。 開始想export CFLAGS進去,但是死活無法生效,嘗試幾次無果。
最后添加了一個軟連接來實現
ln -s $ANDROID_PATH/sysroot/usr/include/arm-linux-androideabi/asm $ANDROID_PATH/sysroot/usr/include/asm
- 錯誤:
[Makefile.shared:197: link_shlib.linux-shared] Error 1
這里 的方案是設置EX_LIBS為空, 但始終無法生效。 最后通過
make clean
make update
make
來解決的。