Android ndk静态链接到openssl失败,BIO_new_dgram未定义

时间:2017-06-04 09:51:50

标签: android-ndk openssl

我构建了libssl.a和libcryto.a。但是当我想将my.so链接到它时,我收到了这个错误:

Error:(130) undefined reference to 'BIO_new_dgram'

如果我删除此调用,我可以将其编译成功。

我是否以错误的方式构建了openssl库?

BIO_new_dgram位于libcrypto.a:

nm libcrypto.a  | grep BIO_new_dgram
0000081c T BIO_new_dgram 

我使用以下命令配置Openssl:

./config shared --openssldir=$install_dir --prefix=$install_dir

和链接命令:

/home/choury/bin/Android/android-sdk-linux/ndk-bundle/toolchains/llvm/prebuilt/l
inux-x86_64/bin/clang++  --target=aarch64-none-linux-android --gcc-toolchain=/ho
me/choury/bin/Android/android-sdk-linux/ndk-bundle/toolchains/aarch64-linux-andr
oid-4.9/prebuilt/linux-x86_64 --sysroot=/home/choury/bin/Android/android-sdk-lin
ux/ndk-bundle/platforms/android-21/arch-arm64 -fPIC -std=c++11 -Wall -fPIC -ggdb
 -O0  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-und
efined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--build
-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noe
xecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,my.so -o
 $outpath/my.so $mypath/a.o $mypath/b.o $install_dir/lib/libssl.a $install_dir/li
b/libcrypto.a -ldl my.a -lz -llog -lm "/home/choury/bin/Android/android-sdk-linux
/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libsupc++.a" "/home/
choury/bin/Android/android-sdk-linux/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9
/libs/arm64-v8a/libgnustl_shared.so"

我使用cmake构建项目,它是Openssl的一部分:

set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
set(OPENSSL_LIBRARIES ${OPENSSL_ROOT_DIR}/lib)
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_LIBRARIES}/libcrypto.a)
set(OPENSSL_SSL_LIBRARY ${OPENSSL_LIBRARIES}/libssl.a)
find_package(OpenSSL REQUIRED IMPORTED)

在build.gradle中使用$ install_dir设置OPENSSL_ROOT_DIR。

1 个答案:

答案 0 :(得分:1)

NDK中的链接器对命令行上的静态库的顺序很敏感。如果 libA.a 依赖于 libB.a ,则命令行应为

clang++ … a.o b.o a/libA.a b/libB.a … -Llibs -lm -ldl -lz -llog -o libqq.so

这里我假设 libm.so libdl.so libz.so liblog.so 。请注意,以下命令是等效的:

clang++ … a.o b.o -La -lA -Lb -lB … -Llibs -lm -ldl -lz -llog -o libqq.so