使用 rustup 查看 支持的target 平台

rustup target list 

# add target
rustup target add x86_64-unknown-linux-musl 

osx

执行编译

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

目标是创建 平台的应用程序,通过静态连接musl, 不再依赖glibc库。 但在 osx 下执行会报错。缺少 musl-gcc

Internal error occurred: Failed to find tool. Is musl-gcc installed?

安装链接器 musl-cross, 其中 musl-cross 是用来专门编译到 linux 的工具链,而 mingw-w64 是用来编译到 windows 的工具链.

brew install FiloSottile/musl-cross/musl-cross

# 创建
ln -s /usr/local/bin/x86_64-linux-musl-gcc /usr/local/bin/musl-gcc

为项目追加 .cargo/config.toml 文件 ( 或者.cargo/config) , 然后追加配置到 .cargo/config.toml; 阅读cargo config文档

[build]
# 设定默认target
# target = "x86_64-unknown-linux-musl"

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
rustflags = ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"]

rustflags 给 rustc 的参数,也支持 [build] 节点。

执行

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

# 或者
CROSS_COMPILE=x86_64-linux-musl-gcc cargo build --release --target x86_64-unknown-linux-musl

使用 rustc 来交叉编译

编译单个文件

rustc -- --target=x86_64-unknown-linux-musl -C linker=x86_64-linux-musl-gcc -C link-args='-Wl,-undefined,dynamic_lookup'

cargo rustc 编译项目, 编译的文件会直接为 debug 内,而非 相应target文件夹内。

cargo rustc -- --target=x86_64-unknown-linux-musl -C linker=x86_64-linux-musl-gcc -C link-args='-Wl,-undefined,dynamic_lookup'

linux

如果在linux下遇到 error: linking with cc failed: exit code: 1, 工具链错误

  • 安装 binutils
yum install binutils