2020-12-24 (一)Rust 入坑安装、修改国内源、使用musl、优化二进制文件等

为以往项目开发 http api ,准备使用rust开发尝个鲜,看是否有应用到其他项目中的可能性,本系列内容均为一步一步入坑的实况,未来有时间可能整理的更为系统性,目前仅作记录。

目标

  • 仅需提供 http api
  • 需运行于各个版本 linux 系统上,有余力可支持windows(以往项目使用java开发,客户服务器版本复杂)
  • 数据库采用mysql(项目要和以往项目共同使用数据库)
  • 支持原有加解密、摘要、编码等方式(原因同上)

1、安装 Rust

curl https://sh.rustup.rs -sSf | sh

安装成功

2、rustup、cargo 换国内源加速

echo "export RUSTUP_DIST_SERVER=https://mirrors.sjtug.sjtu.edu.cn/rust-static" >> ~/.bashrc
echo "export RUSTUP_UPDATE_ROOT=https://mirrors.sjtug.sjtu.edu.cn/rust-static/rustup" >> ~/.bashrc
source ~/.bashrc

cat $HOME/.cargo/config
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
# 指定镜像
replace-with = '镜像源名' # 如:tuna、sjtu、ustc,或者 rustcc

# 注:以下源配置一个即可,无需全部
# 中国科学技术大学
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

# 上海交通大学
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"

# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# rustcc社区
[source.rustcc]
registry = "https://code.aliyun.com/rustcc/crates.io-index.git"

3、安装编译依赖、musl 交叉编译工具链、musl 编译器

由于需要支持各个发行版 linux,目前的想法是采用 musl 平台编译100%静态链接的可执行文件,尽量单文件发布。

sudo apt install build-essential
sudo apt install musl-tools

rustup target add x86_64-unknown-linux-musl

4、创建工作空间目录

mkdir rust_projects
cd rust_projects
cargo new workspace

5、修改工作空间配置

cd workspace
cat Cargo.toml
[workspace]
members = [
"demo"
]

mkdir .cargo
cat .cargo/config
[build]
target = "x86_64-unknown-linux-musl"

7、创建 demo 项目

cargo new --bin demo

8、测试执行

workspace# cargo run --bin demo
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/demo`
Hello, world!

9、构建

workspace# cargo build
Compiling demo v0.1.0 (/opt/rust_projects/workspace/demo)
Finished dev [unoptimized + debuginfo] target(s) in 1.39s

10、查看二进制文件属性

workspace# file target/x86_64-unknown-linux-musl/debug/demo
target/x86_64-unknown-linux-musl/debug/demo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=b52d8266daa7e4f17dfd089455bbbb88fa811d77, with debug_info, not stripped

workspace# ls -l target/x86_64-unknown-linux-musl/debug/demo
-rwxr-xr-x 2 root root 3687136 Dec 24 12:37 target/x86_64-unknown-linux-musl/debug/demo

文件为静态链接,未优化,包含调试信息,未经 strip,大小 3687136

11、(选修)优化二进制文件

(1)增加工作空间配置

cat .cargo/config
[build]
target = "x86_64-unknown-linux-musl"

[profile.release]
panic = 'abort'
opt-level = 'z'
codegen-units = 1
lto = true

优化配置完全参考 https://www.aloxaf.com/2018/09/reduce_rust_size/ 此文章,在此表示感谢。

(2)构建发布版本

workspace# cargo build --release
Compiling demo v0.1.0 (/opt/rust_projects/workspace/demo)
Finished release [optimized] target(s) in 4.76s

(3)查看发布版本二进制文件属性

workspace# file target/x86_64-unknown-linux-musl/release/demo
target/x86_64-unknown-linux-musl/release/demo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=c8ca1905fccc06b7d7a3803238aafe43569189fa, with debug_info, not stripped

workspace# ls -l target/x86_64-unknown-linux-musl/release/demo
-rwxr-xr-x 2 root root 1731352 Dec 24 12:42 target/x86_64-unknown-linux-musl/release/demo

文件为静态链接,包含调试信息,未经 strip,大小 1731352

(4)strip处理

strip -s target/x86_64-unknown-linux-musl/release/demo

(5)查看stripped发布版本二进制文件属性

workspace# file target/x86_64-unknown-linux-musl/release/demo
target/x86_64-unknown-linux-musl/release/demo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=c8ca1905fccc06b7d7a3803238aafe43569189fa, stripped

workspace# ls -l target/x86_64-unknown-linux-musl/release/demo
-rwxr-xr-x 2 root root 292264 Dec 24 12:44 target/x86_64-unknown-linux-musl/release/demo

文件为静态链接,不包含调试信息,stripped,大小 292264

Rust 安装、验证完毕。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 前言 此文为旧文新发,这是我之前翻译文章,因为简书有段时间做内部审查,不能发表文章,所以当时写完放在了其它平台上,...
    wu_sphinx阅读 3,706评论 0 0
  • 本文摘取config.toml.example中的注释信息并进行说明,该文件中的所有选项都被注释掉了,#后就是它们...
    逸之阅读 1,079评论 0 3
  • 版本:1.34.2host:x86_64-unknown-linux-gnu 源码编译安装 环境准备 官方要求具备...
    逸之阅读 5,975评论 0 9
  • github地址:https://github.com/bradyjoestar/rustnotes(欢迎star...
    bradyjoestar阅读 5,999评论 1 3
  • 条件编译的使用方法 两种操作方式进行rust的条件编译 cfg属性:在属性的位置标注 #[cfg(...)]例如 ...
    子由阅读 6,797评论 1 1