You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

用NDK r16b编译64位Android版OpenSSL 1.0.2n遇bsd_signal未定义错误

解决OpenSSL 1.0.2n在Android NDK r16b 64位架构下的bsd_signal未定义错误

你遇到的链接错误核心原因是目标架构配置混淆未使用Android专用编译目标,导致OpenSSL尝试调用Android 64位libc中不兼容的信号函数。以下是具体的解决步骤:

1. 修正环境变量中的架构矛盾

你当前设置了MACHINE=armv7ARCH=arm64,这会让OpenSSL的配置脚本误判目标平台,错误加载32位的信号处理逻辑,最终在64位链接时找不到符号。修正环境变量:

# 移除错误的MACHINE设置,或设置为对应64位架构(可选,OpenSSL会通过ARCH自动识别)
# export MACHINE=arm64
export ARCH=arm64
export CROSS_COMPILE="aarch64-linux-android-"
export ANDROID_NDK_ROOT=/path/to/your/ndk/r16b
export ANDROID_SYSROOT="$ANDROID_NDK_ROOT/platforms/android-21/arch-arm64"
export ANDROID_API=21
export ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin"
export PATH="$ANDROID_TOOLCHAIN:$PATH"
export HOSTCC=gcc

2. 使用Android专用编译目标替代通用Linux目标

你之前用的linux-generic64没有针对Android的bionic libc做适配,而OpenSSL 1.0.2已经提供了android-arm64(对应arm64)和android-x86_64(对应x86_64)的专用编译目标,这些目标会自动处理Android特有的宏定义,避免依赖bsd_signal

修正后的Configure命令:

./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-arm64 \
--openssldir=/usr/local/ssl/android-21 \
-fPIE -D__ANDROID_API__=$ANDROID_API \
--sysroot=$ANDROID_SYSROOT

3. 简化编译参数,避免头文件路径冲突

你之前添加的-I$ANDROID_NDK_ROOT/sysroot/usr/include/aarch64-linux-android已经被--sysroot参数覆盖,重复添加可能导致头文件查找优先级混乱,反而引入错误的函数声明。使用上面的简化命令即可。

4. 执行编译

保持你的make命令不变,重新执行:

make clean
make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" depend
make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" all

针对x86_64架构的适配

如果是编译x86_64,只需要调整对应的环境变量和编译目标:

export ARCH=x86_64
export CROSS_COMPILE="x86_64-linux-android-"
export ANDROID_SYSROOT="$ANDROID_NDK_ROOT/platforms/android-21/arch-x86_64"
export ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/x86_64-linux-android-4.9/prebuilt/darwin-x86_64/bin"

./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-x86_64 \
--openssldir=/usr/local/ssl/android-21-x86_64 \
-fPIE -D__ANDROID_API__=$ANDROID_API \
--sysroot=$ANDROID_SYSROOT

额外排查:强制禁用bsd_signal

如果上述步骤仍有问题,可以手动添加-DNO_BSD_SIGNAL参数,强制OpenSSL不使用bsd_signal,改用Android兼容的sigaction

./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-arm64 \
--openssldir=/usr/local/ssl/android-21 \
-fPIE -D__ANDROID_API__=$ANDROID_API \
--sysroot=$ANDROID_SYSROOT \
-DNO_BSD_SIGNAL

内容的提问来源于stack exchange,提问作者Jordan

火山引擎 最新活动