使用Android NDK编译Rust共享库时遭遇链接错误
问题:Rust编译共享库时链接失败,编译可执行文件正常
编译Rust代码为可执行文件(main.rs)时无链接错误,但编译为共享库(lib.rs)时出现链接失败。错误信息如下:
链接器C:/Users/nafan/AppData/Local/ndk/26.2.11394342/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android34-clang++.cmd执行失败,退出码255;提示:--version-script=C:\Users\nafan\AppData\Local\Temp\rustcfcjtoe\list"" was unexpected at this time。
相关配置与代码:
config.toml
[target.aarch64-linux-android] ar = "C:/Users/nafan/AppData/Local/ndk/26.2.11394342/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android34-clang++" linker = "C:/Users/nafan/AppData/Local/ndk/26.2.11394342/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android34-clang++.cmd"
Cargo.toml
[lib] name = "renderer" crate-type = ["cdylib"] [dependencies] jni = "0.21.1"
lib.rs
use jni::{objects::JClass, sys::jint, JNIEnv}; #[no_mangle] pub extern "C" fn Java_com_example_myapp_RustInterface_rustFunction(_env: JNIEnv, _class: JClass) -> jint { let value = 42; // Example value // Convert the value to JNI jint and return it value as jint }
解决方案
这个错误是Windows下链接器处理--version-script参数时的引号转义问题,Rust生成的命令在CMD中解析出错。可按以下步骤修复:
修改config.toml链接器配置
将linker从.cmd脚本改为直接调用clang++可执行文件,同时指定链接器类型为gcc:[target.aarch64-linux-android] ar = "C:/Users/nafan/AppData/Local/ndk/26.2.11394342/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android34-clang++" linker = "C:/Users/nafan/AppData/Local/ndk/26.2.11394342/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android34-clang++" linker-flavor = "gcc"禁用版本脚本生成(可选)
如果上述方法无效,可通过RUSTFLAGS跳过版本脚本:set RUSTFLAGS=-C link-arg=-Wl,--no-version-script或在Cargo.toml的release配置中添加:
[profile.release] rustflags = ["-C", "link-arg=-Wl,--no-version-script"]验证修复
执行cargo build --target aarch64-linux-android重新编译,检查链接错误是否消失。
内容的提问来源于stack exchange,提问作者Nufun
相关产品推荐
相关产品推荐

