Rust 交叉编译

Rust - 交叉编译

  • 安装链接器
  • rustup 配置
  • 编译
    • 1.遇到的问题

安装链接器

根据你的目标平台自己装一个就好。

1.1 Mac: 通过 brew 安装 musl-cross 工具 来专门编译到 linux 的工具链。

$ brew install FiloSottile/musl-cross/musl-cross  
$ brew install mingw-w64 

1.2 Windows:通过安装 mingw-w64 来专门编译到 linux 的工具链。

rustup target add x86_64-unknown-linux-musl

2.我装的是 musl-cross,装好后到 ~/.cargo/config 文件中添加上:

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

常见问题
要是提示/bin/sh: musl-gcc: command not found,解决方法是安装musl-cross

brew install filosottile/musl-cross/musl-cross

rustup 配置

rustup 是 Rust 的包管理工具,用它来配置工具链可以很省心。
运行 rustup target list 你可以看到很多的目标平台。

$ rustup target list
aarch64-apple-ios
aarch64-linux-android
aarch64-unknown-fuchsia
aarch64-unknown-linux-gnu
aarch64-unknown-linux-musl
arm-linux-androideabi
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
arm-unknown-linux-musleabi
arm-unknown-linux-musleabihf
armv5te-unknown-linux-gnueabi
armv5te-unknown-linux-musleabi
armv7-apple-ios
armv7-linux-androideabi
armv7-unknown-linux-gnueabihf
armv7-unknown-linux-musleabihf
armv7s-apple-ios
asmjs-unknown-emscripten
i386-apple-ios
... ...

我们之前只设置了 target.x86_64-unknown-linux-musl,所以现在也只装对应的这个目标平台相关工具:

$ rustup target add x86_64-unknown-linux-musl

这一步如果很慢可以在你的 .bashrc 或者 .zshrc 中添加这一行,中科大的源加速很靠谱:

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static

编译

接着只要在运行 build 命令时指定 target 就可以了。

$ cargo build --target=x86_64-unknown-linux-musl

接着你可以看到类似这样的文件结构:

├── build
└── target
    └── x86_64-unknown-linux-musl
        └── debug
            ├── build
            ├── deps
            ├── examples
            ├── incremental
            └── native

找到你对应编译好的可执行文件,扔到你的 linux 机子上跑,就可以了。
你可以用 file 命令确认一下:

$ file target/x86_64-unknown-linux-musl/debug/rust-test
target/x86_64-unknown-linux-musl/debug/rust-test: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, with debug_info, not stripped

1.遇到的问题

1在编译Rust源程序时,可能会出现如下 Couldn’t resolve host name (Could not resolve host: crates) 错误(见 https://github.com/ustclug/discussions/issues/294)。

一个临时的解决方法是在运行 cargo 的时候加入环境变量

CARGO_HTTP_MULTIPLEXING=false

。作用是取消并行下载。具体原因可参考用了镜像之后构建rustc报错。

你可能感兴趣的:(Rust,rust,开发语言,后端)