为Android编译OpenSSL时出现链接错误与目标架构不匹配问题
Android交叉编译OpenSSL(Conan依赖)链接失败问题
问题场景
执行Conan安装命令时,流程正常启动交叉编译,但OpenSSL构建阶段链接失败:
conan install /.../my_project -pr:h android34-armv8-clang-17-c++_shared -pr:b default --build=missing
目标架构配置文件
android34-armv8-clang-17-c++_shared配置内容如下:
[settings] os=Android arch=armv8 compiler=clang compiler.version=17 compiler.libcxx=c++_shared build_type=Debug os.api_level=34 [options] [build_requires] [buildenv] ANDROID_NDK_HOME=/home/user/Android/Sdk/ndk/26.3.11579264 ANDROID_NDK=$ANDROID_NDK_HOME ANDROID_NDK_ROOT=/home/user/Android/Sdk/ndk/26.3.11579264 ANDROID_SDK_ROOT=$ANDROID_HOME ANDROID_NDK_VERSION=26.3.11579264 CC=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/clang CXX=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ RANLIB=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib AR=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar [env] ANDROID_NDK_HOME=/home/user/Android/Sdk/ndk/26.3.11579264 ANDROID_NDK_ROOT=/home/user/Android/Sdk/ndk/26.3.11579264 ANDROID_NDK=$ANDROID_NDK_HOME ANDROID_SDK_ROOT=$ANDROID_HOME ANDROID_NDK_VERSION=26.3.11579264 CC=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/clang CXX=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ RANLIB=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib AR=/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar [conf] tools.android:ndk_path=/home/user/Android/Sdk/ndk/26.3.11579264/
构建流程日志
Conan正确识别交叉编译目标(Cross-build from 'Linux:x86_64' to 'Android:armv8'),OpenSSL配置阶段日志如下:
openssl/3.2.1: using target: conan-Debug-Android-armv8-clang-17 -> linux-generic64 openssl/3.2.1: my %targets = ( "conan-Debug-Android-armv8-clang-17" => { inherit_from => [ "linux-generic64" ], cflags => add("-g"), cxxflags => add("-g"), lflags => add(""), perlasm_scheme => "linux64", }, ); openssl/3.2.1: Aggregating env generators openssl/3.2.1: Calling build() openssl/3.2.1: apply_conandata_patches(): No patches defined in conandata openssl/3.2.1: Running: perl ./Configure "conan-Debug-Android-armv8-clang-17" shared --prefix=/ --libdir=lib --openssldir="/home/user/.conan/data/openssl/3.2.1/_/_/package/307503e24fa1e7276c553bf27b1fc9befa5ee61a/res" no-unit-test threads PERL=perl no-tests --debug -D__ANDROID_API__=34 -fPIC enable-fips no-md2 zlib --with-zlib-include="/home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/include" --with-zlib-lib="/home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib" Configuring OpenSSL version 3.2.1 for target conan-Debug-Android-armv8-clang-17 Using os-specific seed configuration ... OpenSSL has been successfully configured ...
链接错误信息
配置成功后,构建阶段出现架构不兼容错误:
/home/user/Android/Sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -fPIC -pthread -g -g -fPIC -Wl,-z,defs -Wl,-znodelete -shared -Wl,-Bsymbolic -L/home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib \ -o providers/fips.so -Wl,--version-script=providers/fips.ld \ providers/fips/fips-dso-fips_entry.o \ providers/libfips.a -lz -ldl -pthread ld.lld: error: /home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib/libz.a(adler32.c.o) is incompatible with elf64-x86-64 ld.lld: error: /home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib/libz.a(compress.c.o) is incompatible with elf64-x86-64 ld.lld: error: /home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib/libz.a(crc32.c.o) is incompatible with elf64-x86-64 ld.lld: error: /home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib/libz.a(deflate.c.o) is incompatible with elf64-x86-64 ld.lld: error: /home/user/.conan/data/zlib/1.3.1/_/_/package/023d2329c8205a068e7539cdd05ad94dd88a0fab/lib/libz.a(gzclose.c.o) is incompatible with elf64-x86-64 ... clang-17: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: *** [Makefile:25460: providers/fips.so] Error 1 make[1]: *** Waiting for unfinished jobs.... clang-17: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: *** [Makefile:26026: util/quicserver] Error 1 clang-17: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: *** [Makefile:5727: libcrypto.so.3] Error 1 make[1]: Leaving directory '/home/user/.conan/data/openssl/3.2.1/_/_/build/307503e24fa1e7276c553bf27b1fc9befa5ee61a/src' make: *** [Makefile:3232: build_sw] Error 2
问题分析
- 核心矛盾:依赖zlib是为armv8架构编译的(符合Android目标设备),但OpenSSL构建流程尝试将其作为x86架构库进行链接,导致不兼容错误。
- 已遵循OpenSSL官方文档(NOTES_ANDROID.md、INSTALL.md、15-android.conf)设置
ANDROID_NDK_ROOT等环境变量,且确认-D__ANDROID_API__已设置为正确的目标API 34。 - 怀疑问题根源在于Conan自动生成的OpenSSL目标
conan-Debug-Android-armv8-clang-17,OpenSSL的conanfile中明确标注“Android targets are very broken”。
补充说明
该问题已提交至Conan相关代码仓库的Issue跟踪。
内容的提问来源于stack exchange,提问作者simonsays
相关产品推荐
相关产品推荐

