rust vs golang 交叉编译

查看 78|回复 10
作者:bli22ard   
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 完败
pursuer   
C/C++的静态交叉编译,glibc 是个坑我得承认,感觉上 musl 静态编译的话应该还好吧?当然 C++动态库 ABI 那就是另一个天坑暂且不提了。
mxT52CRuqR6o5   
听说把 linker 换成 zig 能解决很多交叉编译中的问题
sunny352787   
golang 的交叉编译有坑的,你能编译通过并不意味着你运行正常,之前我用 golang1.22.6 在 macos 上编译一个 windows 版本的程序,时区相关的库各种报错,在 windows 上编译就没问题
PTLin   
请问你是没了解过 rustls 吗,reqwest 也有 rustls 的 feature 呀???
PTLin   
一看 id ,原来又是哥们你呀。。。
bli22ard
OP
  
@pursuer aarch64-musl openssl 太难搞。
PTLin   
下次在得出 rust 发展这么久为什么还没有 rust 实现的 tls 的结论之前能不能拜托你去搜一搜,rustls 好歹 crates 上一亿的下载量。
bli22ard
OP
  
@mxT52CRuqR6o5
zig 貌似也有一些问题
@sunny352787
没用 cgo 情况下,golang ,linux 、mac 、windows 互相交叉编译没遇到过问题
@PTLin
😄,reqwest = {version = "0.12",default-features = false,features = ["rustls-tls"]} 加了这个, 但是编译时候,需要 gcc 来编译 ring
bli22ard
OP
  
@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>
您需要登录后才可以回帖 登录 | 立即注册

返回顶部