Rust编译的so在Android上链接时路径被写死问题

257 阅读1分钟

使用Rust编译一个cdylib的so库:

Cargo.toml

[lib]
crate-type = ["cdylib"]

在Android上用于动态链接:

Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE := libmyso
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES := libmyso.so
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := mybin
LOCAL_SHARED_LIBRARIES := libmyso
LOCAL_SRC_FILES := mybin.cpp
include $(BUILD_EXECUTABLE)

编译出来二进制程序以后,发现在二进制程序里,so库的位置被写死了:

out/target/product/mydev/obj/lib/libmyso.so

这个问题找了两天,终于发现是Rust cargo在编译cdylib时,没有设置SONAME导致的。

在Rust项目里添加build.rs解决:

build.rs

fn main() {
    println!("cargo:rustc-cdylib-link-arg=-Wl,-soname,libmyso.so");
}