Mac Rust编译(Android)动态链接库实践

Building and Deploying a Rust library on Android

官方编译环境配置地址:https://mozilla.github.io/firefox-browser-architecture/experiments/2017-09-21-rust-on-android.html

1、安装Android ndk环境
2、配置ndk 到path中

export ANDROID_HOME=/Users/$USER/Library/Android/sdk
export NDK_HOME=$ANDROID_HOME/ndk-bundle

3、安装rust环境,如果有可以跳过

curl https://sh.rustup.rs -sSf | sh

4、生成交叉编译的文件

  • 先找一个自己常用的目录,然后通过创建一个空文件夹

$符号是命令行中自带的符号,不需要复杂

$ mkdir NDK
$ cd NDK
  • 然后执行 ndk中的一个python 脚本文件,会在NDK目录下生成交叉编译的对应文件
    依次在命令行中执行下边的命令,会生成对应架构的文件
${NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm64 --install-dir NDK/arm64
${NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm --install-dir NDK/arm
${NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch x86 --install-dir NDK/x86

5、然后可以直接切换到 .cargo 的目录下,直接创建一个config文件,并添加编译配置

cd ~/.cargo 
open ./

然后创建一个文本文件。复制一下信息并保存.

[target.aarch64-linux-android]
ar = "<上边NDK的实际路径>/NDK/arm64/bin/aarch64-linux-android-ar"
linker = "<上边NDK的实际路径>/NDK/arm64/bin/aarch64-linux-android-clang"

[target.armv7-linux-androideabi]
ar = "<上边NDK的实际路径>/NDK/arm/bin/arm-linux-androideabi-ar"
linker = "<上边NDK的实际路径>/NDK/arm/bin/arm-linux-androideabi-clang"

[target.i686-linux-android]
ar = "<上边NDK的实际路径>/NDK/x86/bin/i686-linux-android-ar"
linker = "<上边NDK的实际路径>/NDK/x86/bin/i686-linux-android-clang"

然后保存config文件。

6、添加Android架构到rustup中,以便在交叉编译时使用:

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android

7、然后可以通过cargo创建项目,添加配置即可。

8、最后执行编译命令即可

以下三个命令是生成不同系统架构的动态链接库的命令,按需要使用即可

cargo build --target aarch64-linux-android --release
cargo build --target armv7-linux-androideabi --release
cargo build --target i686-linux-android --release

9、编译过程中出现的问题

  1. 目前按以上流程正常情况下基本不会出现问题,但是在本人的电脑上,只能成功编译
    armv7-linux-androideabi的so包,其他架构都提示失败。
    以下是提示信息:
error: linking with `/Users/chenpengfei/Desktop/rust_work/NDK/arm64/bin/aarch64-linux-android-clang` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/Users/chenpengfei/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/chenpengfei/.cargo/bin:/usr/local/bin" VSLANG="1033" "/Users/chenpengfei/Desktop/rust_work/NDK/arm64/bin/aarch64-linux-android-clang" "-Wl,--version-script=/var/folders/43/dq34hssn0cq8ww9gr28fg_dm0000gn/T/rustcXC8DNK/list" "/var/folders/43/dq34hssn0cq8ww9gr28fg_dm0000gn/T/rustcXC8DNK/symbols.o" "/Users/chenpengfei/Desktop/rust_work/rust-android/rust/target/aarch64-linux-android/release/deps/rust.rust.284674e3-cgu.6.rcgu.o" "-Wl,--as-needed" "-L" "/Users/chenpengfei/Desktop/rust_work/rust-android/rust/target/aarch64-linux-android/release/deps" "-L" "/Users/chenpengfei/Desktop/rust_work/rust-android/rust/target/release/deps" "-L" "/Users/chenpengfei/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/aarch64-linux-android/lib" "-Wl,-Bstatic" "/Users/chenpengfei/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/aarch64-linux-android/lib/libcompiler_builtins-a1bf1be11cbf0db9.rlib" "-Wl,-Bdynamic" "-ldl" "-llog" "-lunwind" "-ldl" "-lm" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/Users/chenpengfei/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/aarch64-linux-android/lib" "-o" "/Users/chenpengfei/Desktop/rust_work/rust-android/rust/target/aarch64-linux-android/release/deps/librust.so" "-Wl,--gc-sections" "-shared" "-Wl,-z,relro,-z,now" "-Wl,-O1" "-nodefaultlibs"
 = note: /Users/chenpengfei/Desktop/rust_work/NDK/arm64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: cannot find -lunwind
          clang90: error: linker command failed with exit code 1 (use -v to see invocation)
          

error: could not compile `rust` due to previous error

经过调试,发现是因为Mac电脑上无法安装lunwind 导致,然后使用brew进行安装,但是依然失败。
出现以下异常:

libunwind: Linux is required for this software.

后续使用其他电脑进行测试。

你可能感兴趣的:(工作经验,开发经验,rust,rust,macos,android)