rust vs golang 交叉编译

33 天前
 bli22ard

Golang

Golang 的交叉编译简直太容易了,只需设置 GOOS=linuxGOARCH=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 完败

4456 次点击
所在节点    程序员
52 条回复
Donaldo
32 天前
@c0t #40 现在 mips 的场景主要是什么呢?
AItsuki
32 天前
@c0t 确实看错了问题,不过也没差吧,不管需不需要静态链接,rust 交叉编译确实困难……

当时 windows 交叉编译 linux 一直失败就是因为没有对应的工具链的问题,所以才找的 zigbuild
c0t
32 天前
@AItsuki 你用 musl 在纯 rust 下就不困难了啊…gnu 下不行的原因就是 rustup 默认下载的标准库是动态链接到 glibc
zhwguest
32 天前
说一千道一万,rust 不把基础的标准库问题解决,始终就是让人忐忑不安。但是按照社区这种搞法,估计够呛。都是泪。
c0t
32 天前
@Donaldo 不知道,所以我才说是伪命题,longarch 都是 tier2 ,那些陈年的东西压根就不会用 rust 来写
c0t
32 天前
@AItsuki 其实看一遍龙芯给 rustc 写的文档,你就知道该怎么做了 https://doc.rust-lang.org/rustc/platform-support/loongarch-linux.html
hejw19970413
32 天前
我这几天搞 CGO 的静态编译同样的遇到 C 库不兼容或者 GCC 编译问题。最后是用 chroot 搞定的,也是比较蛋疼
AItsuki
32 天前
@c0t 好吧,但是项目基本上都少不了间接依赖 ring 库,还是需要解决 c 编译问题的😂
bli22ard
31 天前
@c0t 看得出来经验丰富啊👍。有个疑问,openssl-sys 为什么不直接映射 openssl 版本号发布,然后提供对应 rustup target list 所有编译后的版本,在 rust 层屏蔽各个平台的差异性,使用这个 crate 的人员就不用关心平台差异性。不然现在的 cargo build 看起来提供了 --target 支持交叉编译,但是大多数项目都会编译失败,tls 依赖的可能性太高了。现在这样--target ,这个参数太鸡肋了。
很多文章上用系统 openssl 编译 ,apt install libssl-dev 类似这种包管理器直接安装,这种编译使用系统 openssl 链接的,编译稳定性大大降低,因为系统各个版本安装的 openssl 版本不尽相同,难道 openssl 兼容性就这么好
openmynet
31 天前
明显是在钓答案的。
c0t
31 天前
@bli22ard openssl 以前不是 semver 啊…3.0 之后倒是可以这么搞
CodeCodeStudy
30 天前
我做的笔记

在 x86_64 的 windows 编译 aarch64 的 linux 的可执行文件

rustup target add aarch64-unknown-linux-gnu
在这个命令前可以设定环境变量 RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup

需要下载相对应的平台架构的链接器
https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

在项目的 .cargo/config.toml 或者家目录的 .cargo/config
[target.aarch64-unknown-linux-gnu]
linker = "D:/lib/gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc.exe"


参考 https://kkua.github.io/post/cross-compile-rust-to-aarch64/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1090526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX