libcurl linux 静态链接库_Rust 初见填坑-静态链接 musl

问题:

开发环境 Fedora 31 , rustc 1.41.0 , 编译的程序在 CentOS 7 中出现 glibc 版本的依赖问题 错误信息

/lib64/libc.so.6: version `GLIBC_2.18' not found

原因为: rust 编译的程序使用 glibc 2.18 , CentOS 7 中 glibc 版本为 2.17 (差一个小版本)

解决思路(工具提供的配置参数测试无效):

静态连接 glibc ,和 golang 的默认编译方式类似,这样部署程序会方便很多,缺点是带来额外额的程序尺寸。

RFC: https://github.com/rust-lang/rfcs/blob/master/text/1721-crt-static.md

解决方案是增加静态链接的标记

RUSTFLAGS='-C target-feature=+crt-static' cargo build --target=x86_64-unknown-linux-gnu

测试结果: 无效 (也查到一些人反应了问题)

所以只能选择另外的 libc 库进行静态连接,musl 就是最终的选择。通过 rustup 就可以添加 musl 的支持

rustup target add x86_64-unknown-linux-musl
#然后 cargo 添加 target 参数即可
 cargo build --target=x86_64-unknown-linux-musl

以上方法正常可行,前提是你的程序和依赖包,都是 rust 写的,如果遇到使用 C 写的包,在 cargo build 的时候重新编译,这时候就需要单独按照 rust musl 的 toolchain ,在使用 actix 的时候依赖的 backtrace-sys 包就需要重新编译。

使用 https://github.com/richfelker/musl-cross-make 这个仓库的代码即可编译出 x86_64-unknown-linux-musl 的 toolchain

将 x86_64-unknown-linux-musl 的 toolchain bin 目录添加到 PATH 后,配置 CC 环境变量即可,我编译好的 gcc 名称为 x86_64-linux-musl-gcc , 使用以下命令编译即可

CC=x86_64-linux-musl-gcc cargo build --release --target=x86_64-unknown-linux-musl

参考:

https://stackoverflow.com/questions/31770604/how-to-generate-statically-linked-executables

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值