簡體   English   中英

在Linux上使用Clang(NDK 15c獨立工具鏈)為Android構建OpenSSL 1.1.0g

[英]Building OpenSSL 1.1.0g for Android with Clang (NDK 15c standalone toolchain) on Linux

我進行了許多成功的嘗試,以在Linux上使用Clang(NDK 15c Clang獨立工具鏈)為Android構建OpenSSL 1.1.0g。 背景是Qt 5.10需要OpenSSL 1.1.0,而Clang似乎是Android推薦的C ++編譯器(我也使用Clang構建Qt 5.10)。

經過無休止的嘗試后,我構建OpenSSL的最后一個腳本就是這個腳本(上次嘗試有一些注釋過的行,該腳本位於OpenSSL目錄中):

#/bin/sh
export ANDROIDTC="${HOME}/userapps/android/clang_arm_toolchain_15"
export TCBINARIES="$ANDROIDTC/bin"
export TCINCLUDES="$ANDROIDTC/arm-linux-androideabi"
export TCSYSROOT="$ANDROIDTC/sysroot"
export STDCPPTC="$TCINCLUDES/lib/libstdc++.a"

export PATH="$PATH:$TCBINARIES:$TCINCLUDES/bin"
export AS=${TCBINARIES}/arm-linux-androideabi-clang
export CC=${TCBINARIES}/arm-linux-androideabi-clang
export CXX=${TCBINARIES}/arm-linux-androideabi-clang++
export LD=${TCBINARIES}/arm-linux-androideabi-ld
#export CFLAGS="--sysroot=$TCSYSROOT -DANDROID -Wall -I$TCSYSROOT/usr/include -I$TCSYSROOT -I$TCINCLUDES/include -O3 -fomit-frame-pointer -fPIE"
export CFLAGS="--sysroot=$TCSYSROOT -DANDROID -Wall -I$TCINCLUDES/include -O3 -fomit-frame-pointer -fPIE -std=c++14"
export CXXFLAGS="--sysroot=$TCSYSROOT -DANDROID -Wall -I$TCINCLUDES/include -O3 -fomit-frame-pointer -fPIE"
export LDFLAGS="-L$TCSYSROOT/usr/lib -L$TCINCLUDES/lib -llog -fPIE -pie"
export GDB_CFLAGS="--sysroot=$TCSYSROOT -Wall -g -I$TCINCLUDES/include"

make clean

#./config --host=arm-linux --prefix=$TCINCLUDES --libdir="$TCINCLUDES/lib"
#./Configure --host=arm-linux --prefix=$TCINCLUDES --libdir="$TCINCLUDES/lib" --disable-shared --enable-static android-armeabi
./Configure --prefix=$TCINCLUDES --libdir="$TCINCLUDES/lib" android-armeabi
#./Configure --prefix=$TCINCLUDES --libdir="$TCINCLUDES/lib" --openssldir=. android
#./config --host=x86_64-pc-linux-gnu --prefix=$TCINCLUDES --libdir="$TCINCLUDES/lib" android

#make -j 8

配置的輸出是

Configuring for android-armeabi
CC            =/<HOME>/userapps/android/clang_arm_toolchain_15/bin/arm-linux-androideabi-clang
CFLAG         =-Wall -O3 -pthread -fPIC --sysroot=$(CROSS_SYSROOT) -Wa,--noexecstack 
SHARED_CFLAG  =-fPIC -DOPENSSL_USE_NODELETE
DEFINES       =DSO_DLFCN HAVE_DLFCN_H NDEBUG OPENSSL_THREADS OPENSSL_NO_STATIC_ENGINE OPENSSL_PIC OPENSSL_BN_ASM_MONT OPENSSL_BN_ASM_GF2m SHA1_ASM SHA256_ASM SHA512_ASM AES_ASM BSAES_ASM GHASH_ASM ECP_NISTZ256_ASM POLY1305_ASM
LFLAG         =
PLIB_LFLAG    =
EX_LIBS       =-ldl 
APPS_OBJ      =
CPUID_OBJ     =armcap.o armv4cpuid.o
UPLINK_OBJ    =
BN_ASM        =bn_asm.o armv4-mont.o armv4-gf2m.o
EC_ASM        =ecp_nistz256.o ecp_nistz256-armv4.o
DES_ENC       =des_enc.o fcrypt_b.o
AES_ENC       =aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o
BF_ENC        =bf_enc.o
CAST_ENC      =c_enc.o
RC4_ENC       =rc4_enc.o rc4_skey.o
RC5_ENC       =rc5_enc.o
MD5_OBJ_ASM   =
SHA1_OBJ_ASM  =sha1-armv4-large.o sha256-armv4.o sha512-armv4.o
RMD160_OBJ_ASM=
CMLL_ENC      =camellia.o cmll_misc.o cmll_cbc.o
MODES_OBJ     =ghash-armv4.o ghashv8-armx.o
PADLOCK_OBJ   =
CHACHA_ENC    =chacha-armv4.o
POLY1305_OBJ  =poly1305-armv4.o
BLAKE2_OBJ    =
PROCESSOR     =
RANLIB        =ranlib
ARFLAGS       =
PERL          =/usr/bin/perl

THIRTY_TWO_BIT mode
BN_LLONG mode
RC4 uses unsigned char

Configured for android-armeabi.

“ make”的輸出為:

/usr/include/linux/errno.h:1::
In file included from /usr/include/bits/errno.h:24:
/usr/include/linux/errno.h:1:10: 10: fatal error: fatal error: 'asm/errno.h' file not found
#include <asm/errno.h>
        ^~~~~~~~~~~~~
'asm/errno.h' file not found

在這種情況下的問題似乎是找不到sysroot目錄。 (其他嘗試會部分導致其他錯誤。)

有人知道怎么建嗎?

謝謝。

您需要告訴Configure目標asm標頭在哪里。 對於許多體系結構,都有單獨的包含目錄。 看來您可能正在使用獨立的工具鏈,所以該路徑可能對您而言並不完全正確,但是在我的系統上,缺少的標頭位於:

$ANDROID_NDK_ROOT/sysroot/usr/include/arm-linux-androideabi

您已經在標記中添加了-I$TCINCLUDES/include 您還需要添加-I$TCINCLUDES/include/arm-linux-androideabi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM