Golang
Golang 的交叉编译简直太容易了,只需设置 GOOS=linux 和 GOARCH=amd64 这两个环境变量,然后运行 go build 。如果你的代码没有使用 CGO ,基本上都能顺利编译成功。
Rust
像 reqwest 这样的 HTTP 库,TLS 实现默认依赖 OpenSSL ,这会让交叉编译变得复杂起来,因为需要用到 C/C++ 的工具链,还要考虑不同的 libc 是 GNU 还是 MUSL 。虽然 Rust 也有一个纯 Rust 实现的 TLS 库 rustls ,但它依赖 ring 库,而 ring 又使用了一些 C 代码,据说是为了实现加密算法的硬件加速。这些问题使得使用 TLS 的 Rust 程序交叉编译变得异常困难。
即使是在架构、系统、libc 都一致的环境下,想要静态链接编译 Rust 程序也非常麻烦。Rust 团队提供了一个工具 cross,但遇到 OpenSSL 时也可能会束手无策。
Rust 发展了这么久,为什么不能提供一个原生的、零依赖的 TLS 实现呢?
结论
Rust 完败
|