rust vs golang 交叉编译

bli22ard · 2024-11-18 16:02:13 · 1137 次点击

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 完败

举报· 1137 次点击
登录 注册 站外分享
10 条回复  
pursuer 小成 2024-11-18 16:14:21
C/C++的静态交叉编译,glibc 是个坑我得承认,感觉上 musl 静态编译的话应该还好吧?当然 C++动态库 ABI 那就是另一个天坑暂且不提了。
mxT52CRuqR6o5 小成 2024-11-18 16:19:47
听说把 linker 换成 zig 能解决很多交叉编译中的问题
sunny352787 小成 2024-11-18 16:26:40
golang 的交叉编译有坑的,你能编译通过并不意味着你运行正常,之前我用 golang1.22.6 在 macos 上编译一个 windows 版本的程序,时区相关的库各种报错,在 windows 上编译就没问题
PTLin 小成 2024-11-18 16:29:25
请问你是没了解过 rustls 吗,reqwest 也有 rustls 的 feature 呀???
PTLin 小成 2024-11-18 16:30:31
一看 id ,原来又是哥们你呀。。。
bli22ard 楼主 小成 2024-11-18 16:32:42
@pursuer aarch64-musl openssl 太难搞。
PTLin 小成 2024-11-18 16:34:14
下次在得出 rust 发展这么久为什么还没有 rust 实现的 tls 的结论之前能不能拜托你去搜一搜,rustls 好歹 crates 上一亿的下载量。
bli22ard 楼主 小成 2024-11-18 16:34:53
@mxT52CRuqR6o5 zig 貌似也有一些问题 @sunny352787 没用 cgo 情况下,golang ,linux 、mac 、windows 互相交叉编译没遇到过问题 @PTLin 😄,reqwest = {version = "0.12",default-features = false,features = ["rustls-tls"]} 加了这个, 但是编译时候,需要 gcc 来编译 ring
bli22ard 楼主 小成 2024-11-18 16:37:34
@PTLin (base) PS C:\Users\3\RustroverProjects\rs-certbot> cargo tree --target=x86_64-unknown-linux-musl -i ring ring v0.17.8 |-- instant-acme v0.7.2 | `-- rs-certbot v0.1.0 (C:\Users\3\RustroverProjects\rs-certbot) |-- rcgen v0.13.1 | `-- rs-certbot v0.1.0 (C:\Users\3\RustroverProjects\rs-certbot) |-- rustls v0.23.16 | |-- hyper-rustls v0.27.3 | | |-- instant-acme v0.7.2 (*) | | `-- reqwest v0.12.9 | | `-- rs-certbot v0.1.0 (C:\Users\3\RustroverProjects\rs-certbot) | |-- reqwest v0.12.9 (*) | `-- tokio-rustls v0.26.0 | |-- hyper-rustls v0.27.3 (*) | `-- reqwest v0.12.9 (*) |-- rustls-webpki v0.102.8 | `-- rustls v0.23.16 (*) `-- x509-parser v0.16.0 `-- rs-certbot v0.1.0 (C:\Users\3\RustroverProjects\rs-certbot) (base) PS C:\Users\3\RustroverProjects\rs-certbot> (base) PS C:\Users\3\RustroverProjects\rs-certbot> cargo tree --target=x86_64-unknown-linux-musl -i openssl-sys error: package ID specification `openssl-sys` did not match any packages (base) PS C:\Users\3\RustroverProjects\rs-certbot>
12下一页
返回顶部