哈嘍,大家好,我是LittleG。
前言
之前文章《Android java、native、kernel獲取堆棧信息常用方法總結(jié)》有提到編程語(yǔ)言是工具。我最近剛剛?cè)胧至艘粋€(gè)新的工具,就是 Rust ,記錄分享下。
簡(jiǎn)單介紹下 Rust :
Rust 是最近幾年很火的一門編程語(yǔ)言,由 Mozilla 公司開發(fā)。據(jù)說(shuō)安全性
要比 C 或 C++ 語(yǔ)言好,而且效率
可以媲美 C 或 C++ 語(yǔ)言。目前谷歌在力推,正在逐步替換進(jìn)Android
。貌似 Linux 內(nèi)核
也在接受改變,網(wǎng)上有傳,占據(jù)linux內(nèi)核代碼將近一半的驅(qū)動(dòng)代碼
,有率先被 Rust 替換開發(fā)的可能;也就是說(shuō),以后我們寫 linux 驅(qū)動(dòng)代碼,很有可能就要用 Rust 來(lái)寫了
。
了解幾個(gè) Rust 相關(guān)概念:
rustup
是 rust 官方推出的基于 終端/控制臺(tái)/shell 的工具鏈管理工具,可用于管理 rust 版本和相關(guān)工具,如安裝哪個(gè)版本的rust和常用組件等。
cargo
是用 rust 寫的一個(gè)包管理工具(可以直接在http://crates.io上搜到并當(dāng)作依賴來(lái)用) + 工程管理工具,類似c++ 等同于conan+cmake+make;可以用來(lái)構(gòu)建工程,最后編譯還是用 rustc。
rustc
是 rust 的編譯器。類似 c++ 等同于gcc g++。
我決定嘗鮮體驗(yàn) rust 的環(huán)境是 ubuntu 22.04,考慮到是剛新裝ok的ubuntu 22.04,所以在下載安裝rust之前,我先需要更新下ubuntu 包管理工具的鏡像源,更新為國(guó)內(nèi)的鏡像源,避免被墻的問題,下載速度也會(huì)快很多。網(wǎng)上找了 ubuntu 22.04 的 tsinghua 鏡像源,配置如下:
1、修改保存到 /etc/apt/sources.list
:
# 默認(rèn)注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # 預(yù)發(fā)布軟件源,不建議啟用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
2、保存/etc/apt/sources.list
并退出后,更新deb源即可;
sudo apt update
等待更新完成即可;
鏡像源更新ok,然后就可以開始安裝 rust 了。
Linux下安裝命令為curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
:
james@linux:~$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installer Welcome to Rust! This will download and install the official compiler for the Rust programming language, and its package manager, Cargo. Rustup metadata and toolchains will be installed into the Rustup home directory, located at: /home/james/.rustup This can be modified with the RUSTUP_HOME environment variable. The Cargo home directory is located at: /home/james/.cargo This can be modified with the CARGO_HOME environment variable. The cargo, rustc, rustup and other commands will be added to Cargo's bin directory, located at: /home/james/.cargo/bin This path will then be added to your PATH environment variable by modifying the profile files located at: /home/james/.profile /home/james/.bashrc ...... You can uninstall at any time with rustup self uninstall and these changes will be reverted. Current installation options: ? default host triple: x86_64-unknown-linux-gnu ? ? default toolchain: stable (default) ? ? ? ? ? ? ? profile: default modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation > info: profile set to 'default' info: default host triple is x86_64-unknown-linux-gnu info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu' info: latest update on 2022-07-19, rust version 1.62.1 (e092d0b6b 2022-07-16) info: downloading component 'cargo' info: downloading component 'clippy' info: downloading component 'rust-docs' info: downloading component 'rust-std' info: downloading component 'rustc' info: downloading component 'rustfmt' ...... info: installing component 'cargo' info: installing component 'clippy' info: installing component 'rust-docs' info: installing component 'rust-std' info: installing component 'rustc' info: installing component 'rustfmt' info: default toolchain set to 'stable-x86_64-unknown-linux-gnu' stable-x86_64-unknown-linux-gnu installed - rustc 1.62.1 (e092d0b6b 2022-07-16) Rust is installed now. Great! To get started you may need to restart your current shell. This would reload your PATH environment variable to include Cargo's bin directory ($HOME/.cargo/bin). To configure your current shell, run: source "$HOME/.cargo/env"
看到如上輸出,說(shuō)明 rust 基本組件安裝完成了。注意按照最后輸出的提示重新當(dāng)前shell終端,然后執(zhí)行:
james@linux:~$ source "$HOME/.cargo/env"
在 Rust 開發(fā)環(huán)境中,所有工具都安裝在 ~/.cargo/bin
目錄中,可以在這里找到包括 rustc
、cargo
和 rustup
在內(nèi)的 Rust 工具鏈。如:
james@linux:~/.cargo/bin$ ls -l -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 cargo -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 cargo-clippy -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 cargo-fmt -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 cargo-miri -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 clippy-driver -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rls -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rust-gdb -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rust-gdbgui -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rust-lldb -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rustc -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rustdoc -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rustfmt -rwxr-xr-x 13 james james 15825920 Aug ?1 17:20 rustup
如果環(huán)境OK,通過執(zhí)行rustc --version
就可以看到具體的版本號(hào)了。
接下來(lái),就可以使用 rust 寫一個(gè)簡(jiǎn)單的 helloworld 程序,驗(yàn)證一下 rust 編譯環(huán)境是否正常了。
如我寫了一個(gè)簡(jiǎn)單的 Hello.rs
:
fn main() { ? ?println!("Hello world!"); ? ?println!("Nice to meeting you!"); }
編譯 rustc Hello.rs
:
james@linux:~$ rustc Hello.rs
提一下:
編譯時(shí)可能會(huì)碰到,提示
linker cc not found
鏈接錯(cuò)誤:error: linker `cc` not found | = note: No such file or directory (os error 2) error: aborting due to previous error原因可能是因?yàn)楸镜氐?gcc 沒有安裝 或者 ?沒有對(duì)應(yīng)的 cc 軟連接 ,需要自己手動(dòng)安裝一下或者手動(dòng)建立一下軟鏈接:
sudo apt install gcc sudo ln -s gcc cc注意,如果安裝后還提示 gcc 版本或者依賴之類的錯(cuò)誤,則可以使用ubuntu特有的可以解決依賴關(guān)系的包管理工具
aptitude
進(jìn)行安裝,解決依賴,如果沒有aptitude
,可以先安裝之,apt install aptitude aptitude install gcc通過
aptitude
安裝,會(huì)給出解決依賴的方案,注意查看輸出提示,選擇操作即可。
如果沒有編譯錯(cuò)誤,執(zhí)行 ?rustc Hello.rs
后,就會(huì)看到當(dāng)前目錄下會(huì)多出來(lái)一個(gè)同名的可執(zhí)行文件:
james@linux:~/$ ls Hello Hello.rs james@linux:~/$ file Hello Hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=xxxxxxxxxxxxxxxxxxxxx, for GNU/Linux 3.2.0, with debug_info, not stripped
既然是可執(zhí)行文件,說(shuō)明我們和 C語(yǔ)言編譯出來(lái)的 ?Linux C 程序一樣執(zhí)行應(yīng)該就可以,試一下:
james@linux:~/$ ./Hello Hello world! Nice to meeting you!
成功輸出,說(shuō)明 rust 環(huán)境和工具鏈的安裝就緒了。
以后如果想卸載 Rust,可以執(zhí)行:rustup self uninstall
以后如果想更新 Rust,可以執(zhí)行:rustup update
最后再簡(jiǎn)單說(shuō)明下測(cè)試程序:
// rust test fn main() { ? ?println!("Hello world!"); ? ?println!("Nice to meeting you!"); }
1、Rust 使用 fn
關(guān)鍵字定義一個(gè)函數(shù);
2、Rust 的打印日志語(yǔ)句,println 后面都跟一個(gè) 感嘆號(hào) ( !
),指明println!()
是 Rust 中的一個(gè) 預(yù)定義的宏
,打印輸出是一個(gè) 宏調(diào)用。在 rust 中區(qū)分函數(shù)和宏的唯一辦法,就是看函數(shù)名/宏名最后有沒有 感嘆號(hào) !
. 如果有感嘆號(hào)則是宏,沒有則是函數(shù)。
3、Rust 代碼注釋,和 C語(yǔ)言、C++是一樣的語(yǔ)法;
4、Rust 輸出文字的方式主要有兩種:println!()
和 print!()
。這兩個(gè)"函數(shù)"都是向命令行輸出字符串的方法,區(qū)別僅在于前者
會(huì)在輸出的最后附加
輸出一個(gè)換行符
。當(dāng)用這兩個(gè)"函數(shù)"輸出信息的時(shí)候,第一個(gè)參數(shù)是格式字符串,后面是一串可變參數(shù),對(duì)應(yīng)著格式字符串中的"占位符",這一點(diǎn)與 C 語(yǔ)言中的 printf 函數(shù)很相似。但是,Rust 中格式字符串中的占位符不是 "% + 字母"
的形式,而是一對(duì) {}
。