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

Android ndk Android ndk静态链接到openssl失败,BIO_new_dgram未定义,android-ndk,openssl,Android Ndk,Openssl,我构建了libssl.a和libcryto.a。但是当我想将我的.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:

我构建了libssl.a和libcryto.a。但是当我想将我的.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)

OPENSSL\u ROOT\u DIR在build.gradle中设置为$install\u DIR。

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.solibdl.solibz.soliblog.so。请注意,以下命令是等效的:

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

我们不知道您是如何构建库的,因此我们无法确定。我构建它是参考您是否使用
无dgram
配置OpenSSL的
-DOPENSSL\u无dgram
?执行nm libssl.a | grep-i BIO_new_dgram
并查看符号是否可用。否则,请说明OpenSSL的位置,并显示
my.so
@jww的链接命令。@AlexCohn就是这样,它解决了我的问题,非常感谢!