Rust交叉编译到Android时出现ld: error: unable to find library -lgcc怎么解决
问题根因
你使用的NDK 23及以上版本移除了libgcc,改用libunwind作为替代,而Rust默认的Android交叉编译配置仍会向链接器传递-lgcc参数,导致链接失败。只有编译为rlib时不需要执行最终的动态库链接步骤,所以不会触发该错误。
解决方案
方法1:添加链接参数替换libgcc(适配NDK r23+,无需额外工具)
在你的.cargo/config(或项目根目录的.cargo/config.toml)中,针对Android目标添加链接标记,把-lgcc替换为-lunwind -ldl,示例配置如下:
[target.arm-linux-androideabi] linker = "/opt/android-sdk/ndk/23.0.7599858/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi31-clang" rustflags = [ "-C", "link-arg=-lgcc", "-C", "link-arg=-lunwind", "-C", "link-arg=-ldl", ]
如果需要同时编译其他Android架构(如aarch64-linux-android、i686-linux-android、x86_64-linux-android),每个目标都要添加对应rustflags配置。
方法2:降级NDK版本
如果不想修改编译配置,可以将NDK版本切换到22.x及更低版本,这些版本仍保留libgcc,无需额外修改配置即可正常编译出cdylib格式的.so文件。
方法3:使用cargo-ndk工具自动适配
社区封装的cargo-ndk工具会自动适配不同NDK版本的链接参数,无需手动处理配置:
- 安装工具:
cargo install cargo-ndk - 执行编译命令:
ANDROID_NDK_HOME=/opt/android-sdk/ndk/23.0.7599858 cargo ndk --target armv7-linux-androideabi --platform 31 build --release
编译完成后的.so文件会存放在对应target目录的release文件夹中。
内容的提问来源于stack exchange,提问作者StackOverflower
相关产品推荐
相关产品推荐

