rust編譯到linux
『壹』 【RUST_BASIC】Rust for linux環境搭建
Rust 提供簡單的一鍵安裝,命令如下:
rustup 是 Rust 官方的版本管理工具,安裝前首先配置國內鏡像加速更新工具鏈:
運行以下命令進行安裝:
安裝後工具鏈會被安裝到 $HOME/.cargo/bin 目錄,.cargo/bin 目錄會被添加到系統的 $PATH 環境變數,重新登錄後即可使用 rustc,cargo 等命令。
使用國內鏡像加速更新 crate 拉取,將如下配置寫入 $HOME/.cargo/config 文件:
Rust 有三個 發布通道 (release channel):
使用 nightly 版本:
安裝 RLS 組件:
安裝 WASM:
安裝 racer:
https://rustcc.gitbooks.io/rustprimer/content/install/install_rust_on_linux.html
『貳』 我們為什麼用Rust
Rust 是一門系統級編程語言,被設計為保證內存和線程安全,防止段錯誤產生。作為系統級編程語言,它的基本理念是 「零開銷抽象」。理論上來說,它的速度與 C/C++ 同級。Rust 可以被歸為通用的、多範式、編譯型的編程語言,類似 C/C++。與這兩門編程語言不同的是,Rust 是線程安全的!Rust 編程語言的目標是,創建一個安全和並發的軟體系統。它強調安全性、並發和內存控制。盡管 Rust 借用了 C/C++ 的語法,卻杜絕了空指針和懸掛指針,而這二者是 C/C++ 中系統崩潰、內存泄露和不安全代碼的根源。
雖然 Rust 是一門系統級編程語言,但並不意味著它只能寫底層程序(操作系統、驅動、工具、資料庫、搜索引擎等),它的抽象層次之高完全給人驚艷的感覺,實踐證明它對問題建模的能力和方便性不比 C++/Java/Python/Ruby 差。但 Haskell 這類超高抽象語言,也不是 Rust 的發展方向。Rust 力求在抽象與現實世界中找到一個平衡。
在向SCRY 項目研發負責人Peace交流時,他說到,當時選擇Rust,主要有兩個原因:一是有高性能要求時,原來好多人會選擇C/C++,現在多了一個Rust選擇,還解決了C/C++許多不足;二是Rust應用在區塊鏈有成熟的參考。最後Peace給了未來使用SCRY項目開源部分的學習者一些建議,「快速的學習能力,快樂地把小事做好,正確合理定義一個函數。」
Rust到底有多受歡迎呢?目前,Rust 已經在 StackOverflow 的年度語言評選中,連續 4 年榮獲「程序員最喜愛語言」第一名(2016, 2017, 2018, 2019)。以下是 2019 年調查的截圖:
但比起Python、C、C++ 等,Rust還只是個小年輕。調查顯示,更多的人不去學習 Rust 還是因為 Rust 沒有足夠的活躍商業項目讓它成為企業的一部分。
不過,Rust 在工作中的佔比也越來越高。過去一年間,Rust 在商業應用上有著令人驚訝的成長。下面是部分人們熟知的公司:
國內的網路,阿里,也已經在內部小范圍的使用上了Rust。
就在本月初,微軟還推出了基於 Rust 的 Windows 運行時項目 Rust/WinRT。該項目和 C++/WinRT 一脈相承,用標准語言和編譯器為 Windows 運行時構建語言投影,從而方便 Rust 開發人員調用 Windows API,更輕松地使用 Rust 構建各類 Windows 應用和組件。
(https://blogs.windows.com/windowsdeveloper/2020/04/30/rust-winrt-public-preview/)
2015年下半年,Gavin Wood 博士創立了 Parity Technologies,推出以太坊(Ethereum)客戶端 parity,而這個 parity 客戶端就是使用Rust寫的。實際在 parity 出現之前,MaidSafe項目就已經出現了。MaidSafe用 Rust 語言嘗試了很多東西。Rust語言本身強調的安全性以及MaidSafe這些前沿項目,可能給了 Gavin 充分的理由選擇 Rust 作為 parity 開發語言。
寫一個有效率的、符合習慣的Rust程序比寫一個有潛在危險的程序容易得多。下面是Linux內核在2018年一月到四月期間發現的bug:
而對於Rust而言,上圖右側佔比 51% 的部分,從語言層面就可以避免。也就是說,對Rust來說,根本不存在上圖右邊這些問題。
Rust在實現內存安全和並發安全的同時,並沒有以損失性能為代價。更牛逼的是,它甚至是用同一套抽象解決了內存安全和數據競爭這兩個不同領域的問題。
Rust的零開銷抽象讓你在享受安全性的同時,又不損失性能。這正是傳統的程序員夢寐以求的。
Solana的首席執行官Anatoly Yakovenko在一段采訪中提到剛開始項目的時候,他用了兩周時間使用C語言,但是當用到一些外部庫的時候,還得寫makefile,手動下載這些庫,比較麻煩。所以,他決定嘗試一下Rust。就在那一刻,「Holy shit, this is amazing.」「我才覺醒到,這是一個和C語言一樣快的語言,並且還給了我Haskell般的類型安全。Rust擊中了我,這真的很酷。」
今天Rust滿5歲了(2020年5月15日,是Rust語言正式發布5年生日)。Rust語言正在IT工業各個領域快速發展,而由於區塊鏈本身的特質,區塊鏈領域是較早接納Rust的領域之一。在區塊鏈領域,Rust正以勢如破竹之勢佔領區塊鏈新興項目市場,很多著名的老項目也在考慮轉向使用Rust重寫。
祝Rust 5周年生日快樂!
參考:
1. Why Rust?
https://www.parity.io/why-rust/
2. Meetup with Solana, Zcash, & Parity — Why Rust Is Ideal For Blockchain Development?
https://medium.com/solana-labs/solana-at-portland-dev-meetup-72e4dc7ad32c
3. Rust 2017 Survey Results
https://blog.rust-lang.org/2017/09/05/Rust-2017-Survey-Results.html
4. 微軟開源 Rust/WinRT,方便使用 Rust 構建 Windows 應用
https://www.oschina.net/news/115354/microsoft-winrt
5. Stack Overflow』s Developer Survey Results 2019
https://insights.stackoverflow.com/survey/2019#developer-profile-_-what-inpial-person-will-have-the-most-influence-in-tech-this-year
6. 當區塊鏈遇上Rust
https://rustcc.cn/article?id=289da7be-19ce-49fe-af6d-3a7946404ca6
『叄』 rust為什麼在中國不火
目前眼下的Rust 編譯,對CPU資源的消耗是很恐怖的。編譯速度非常慢。就算你有很好的硬體,都快不起來。
具體原因,有很多人在分析,這里就不說廢話了。慢,阻止我們去用它,因為業務迭代,我們代碼基本上分鍾級別都在發生變化,有版本變更,需要構建。
因此低效率的編譯器,讓這方面的成本,無法接受。所以目前我們用的一些成熟的技術。
Rust在編譯速度這塊,沒有優勢,因此失去了首選優勢。
Rust:
Rust是一門系統編程語言,專注於安全,尤其是並發安全,支持函數式和命令式以及泛型等編程範式的多範式語言。Rust在語法上和C++類似,但是設計者想要在保證性能的同時提供更好的內存安全。
Rust最初是由Mozilla研究院的Graydon Hoare設計創造,然後在Dave Herman, Brendan Eich以及很多其他人的貢獻下逐步完善的。Rust的設計者們通過在研發Servo網站瀏覽器布局引擎過程中積累的經驗優化了Rust語言和Rust編譯器。
『肆』 rust里的rustangelo怎麼用
燒錄卡是不能直接播放音樂的,題主你只能用多媒體程序播放音樂
建議網路moonshl2這個,是專門用於在NDS燒錄卡上播放音樂的
『伍』 rust可以開發分布式系統嗎
rust是可以開發分布式系統的。
引子
構建一個分布式系統 並不是一件容易的事情,我們需要考慮很多的問題,首先就是我們的系統到底需要提供什麼樣的功能,譬如:
一致性:我們是否需要保證整個系統的線性一致性,還是能容忍短時間的數據不一致,只支持最終一致性。
穩定性:我們能否保證系統 7 x 24 小時穩定運行。系統的可用性是 4 個 9,還有 5 個 9?如果出現了機器損壞等災難情況,系統能否做的自動恢復。
擴展性:當數據持續增多,能否通過添加機器就自動做到數據再次平衡,並且不影響外部服務。
分布式事務:是否需要提供分布式事務支持,事務隔離等級需要支持到什麼程度。
Go,Go 是我們團隊最擅長的一門語言,而且 Go 提供的 goroutine,channel 這些機制,天生的適合大規模分布式系統的開發,但靈活方便的同時也有一些甜蜜的負擔,首先就是 GC,雖然現在 Go 的 GC 越來越完善,但總歸會有短暫的卡頓,另外 goroutine 的調度也會有切換開銷,這些都可能會造成請求的延遲增高。
Java,現在世面上面有太多基於 Java 做的分布式系統了,但 Java 一樣有 GC 等開銷問題,同時我們團隊在 Java 上面沒有任何開發經驗,所以沒有採用。
C++,C++ 可以認為是開發高性能系統的代名詞,但我們團隊沒有特別多的同學能熟練掌握 C++,所以開發大型 C++ 項目並不是一件非常容易的事情。雖然使用現代 C++ 的編程方式能大量減少 data race,dangling pointer 等風險,我們仍然可能犯錯。
靜態語言,這樣才能最大限度的保證運行性能。
無 GC,完全手動控制內存。
Memory safe,盡量避免 dangling pointer,memory leak 等問題。
Thread safe,不會遇到 data race 等問題。
包管理,我們可以非常方便的使用第三方庫。
高效的 C 綁定,因為我們還可能使用一些 C library,所以跟 C 交互不能有開銷。
我們團隊沒有任何 Rust 開發經驗,全部都需要花時間學習 Rust,而偏偏 Rust 有一個非常陡峭的學習曲線。
基礎網路庫的缺失,雖然那個時候 Rust 已經出了 1.0,但我們發現很多基礎庫都沒有,譬如在網路庫上面只有 mio,沒有好用的 RPC 框架,HTTP 也不成熟。
TrueTime,TrueTime 是 Google Spanner 使用的方式,不過它需要硬體 GPS + 原子鍾支持,而且 Spanner 並沒有在論文裡面詳細說明硬體環境是如何搭建的,外面要自己實現難度比較大。
HLC,HLC 是一種混合邏輯時鍾,它使用 Physical Time 和 Logical Clock 來確定事件的先後順序,HLC 已經在一些應用中使用,但 HLC 依賴 NTP,如果 NTP 精度誤差比較大,很可能會影響 commit wait time。
TSO,TSO 是一個全局授時器,它直接使用一個單點服務來分配時間。TSO 的方式很簡單,但會有單點故障問題,單點也可能會有性能問題。
Lock,就是要修改數據的實際 lock,在一個 Percolator 事務裡面,有一個 primary key,還有其它 secondary keys, 只有 primary key 先加鎖成功,我們才會再去嘗試加鎖後續的 secondary keys。
Write,保存的是數據實際提交寫入的 commit timestamp,當一個事務提交成功之後,我們就會將對應的修改行的 commit timestamp 寫入到 Write 上面。
Data,保存實際行的數據。
Prewrite:先嘗試給 primary key 加鎖,然後嘗試給 second keys 加鎖。如果對應 key 上面已經有 Lock,或者在 start timestamp 之後,Write 上面已經有新的寫入,Prewrite 就會失敗,我們就會終止這次事務。在加鎖的時候,我們也會順帶將數據寫入到 Data 上面。
Commit:當所有涉及的數據都加鎖成功之後,我們就可以提交 primay key,這時候會先判斷之前加的 Lock 是否還在,如果還在,則刪掉 Lock,將 commit timestamp 寫入到 Write。當 primary key 提交成功之後,我們就可以非同步提交 second keys,我們不用在乎 primary keys 是否能提交成功,即使失敗了,也有機制能保證數據被正常提交。
上面的問題在系統設計之初,就需要考慮好,作為整個系統的設計目標。為了實現這些特性,我們就需要考慮到底採用哪一種實現方案,取捨各個方面的利弊等。
後面,我將以我們開發的分布式 Key-Value TiKV 作為實際例子,來說明下我們是如何取捨並實現的。
TiKV
TiKV 是一個分布式 Key-Value store,它使用 Rust 開發,採用 Raft 一致性協議保證數據的強一致性,以及穩定性,同時通過 Raft 的 Configuration Change 機制實現了系統的可擴展性。
TiKV 提供了基本的 KV API 支持,也就是通常的 Get,Set,Delete,Scan 這樣的 API。TiKV 也提供了支持 ACID 事務的 Transaction API,我們可以使用 Begin 開啟一個事務,在事務裡面對 Key 進行操作,最後再用 Commit 提交一個事務,TiKV 支持 SI 以及 SSI 事務隔離級別,用來滿足用戶的不同業務場景。
Rust
在規劃好 TiKV 的特性之後,我們就要開始進行 TiKV 的開發。這時候,我們面臨的第一個問題就是採用什麼樣的語言進行開發。當時,擺在我們眼前的有幾個選擇:
當我們排除了上面幾種主流語言之後,我們發現,為了開發 TiKV,我們需要這門語言具有如下特性:
綜上,我們決定使用 Rust,Rust 是一門系統編程語言,它提供了我們上面想要的語言特性,但選擇 Rust 對我們來說也是很有風險的,主要有兩點:
但我們還是決定使用 Rust,對於第一點,我們團隊花了將近一個月的時間來學習 Rust,跟 Rust 編譯器作斗爭,而對於第二點,我們就完全開始自己寫。
幸運的,當我們越過 Rust 那段陣痛期之後,發現用 Rust 開發 TiKV 異常的高效,這也就是為啥我們能在短時間開發出 TiKV 並在生產環境中上線的原因。
一致性協議
對於分布式系統來說,CAP 是一個不得不考慮的問題,因為 P 也就是 Partition Tolerance 是一定存在的,所以我們就要考慮到底是選擇 C - Consistency 還是 A - Availability。
我們在設計 TiKV 的時候就決定 - 完全保證數據安全性,所以自然就會選擇 C,但其實我們並沒有完全放棄 A,因為多數時候,畢竟斷網,機器停電不會特別頻繁,我們只需要保證 HA - High Availability,也就是 4 個 9 或者 5 個 9 的可用性就可以了。
既然選擇了 C,我們下一個就考慮的是選用哪一種分布式一致性演算法,現在流行的無非就是 Paxos 或者 Raft,而 Raft 因為簡單,容易理解,以及有很多現成的開源庫可以參考,自然就成了我們的首要選擇。
在 Raft 的實現上,我們直接參考的 etcd 的 Raft。etcd 已經被大量的公司在生產環境中使用,所以它的 Raft 庫質量是很有保障的。雖然 etcd 是用 Go 實現的,但它的 Raft library 是類似 C 的實現,所以非常便於我們用 Rust 直接翻譯。在翻譯的過程中,我們也給 etcd 的 Raft fix 了一些 bug,添加了一些功能,讓其變得更加健壯和易用。
現在 Raft 的代碼仍然在 TiKV 工程裡面,但我們很快會將獨立出去,變成獨立的 library,這樣大家就能在自己的 Rust 項目中使用 Raft 了。
使用 Raft 不光能保證數據的一致性,也可以藉助 Raft 的 Configuration Change 機制實現系統的水平擴展,這個我們會在後面的文章中詳細的說明。
存儲引擎
選擇了分布式一致性協議,下一個就要考慮數據存儲的問題了。在 TiKV 裡面,我們會存儲 Raft log,然後也會將 Raft log 裡面實際的客戶請求應用到狀態機裡面。
首先來看狀態機,因為它會存放用戶的實際數據,而這些數據完全可能是隨機的 key - value,為了高效的處理隨機的數據插入,自然我們就考慮使用現在通用的 LSM Tree 模型。而在這種模型下,RocksDB 可以認為是現階段最優的一個選擇。
RocksDB 是 Facebook 團隊在 LevelDB 的基礎上面做的高性能 Key-Value Storage,它提供了很多配置選項,能讓大家根據不同的硬體環境去調優。這里有一個梗,說的是因為 RocksDB 配置太多,以至於連 RocksDB team 的同學都不清楚所有配置的意義。
關於我們在 TiKV 中如何使用,優化 RocksDB,以及給 RocksDB 添加功能,fix bug 這些,我們會在後面文章中詳細說明。
而對於 Raft Log,因為任意 Log 的 index 是完全單調遞增的,譬如 Log 1,那麼下一個 Log 一定是 Log 2,所以 Log 的插入可以認為是順序插入。這種的,最通常的做法就是自己寫一個 Segment File,但現在我們仍然使用的是 RocksDB,因為 RocksDB 對於順序寫入也有非常高的性能,也能滿足我們的需求。但我們不排除後面使用自己的引擎。
因為 RocksDB 提供了 C API,所以可以直接在 Rust 裡面使用,大家也可以在自己的 Rust 項目裡面通過 rust-rocksdb 這個庫來使用 RocksDB。
分布式事務
要支持分布式事務,首先要解決的就是分布式系統時間的問題,也就是我們用什麼來標識不同事務的順序。通常有幾種做法:
TiKV 採用了 TSO 的方式進行全局授時,主要是為了簡單。至於單點故障問題,我們通過 Raft 做到了自動 fallover 處理。而對於單點性能問題,TiKV 主要針對的是 PB 以及 PB 以下級別的中小規模集群,所以在性能上面只要能保證每秒百萬級別的時間分配就可以了,而網路延遲上面,TiKV 並沒有全球跨 IDC 的需求,在單 IDC 或者同城 IDC 情況下,網路速度都很快,即使是異地 IDC,也因為有專線不會有太大的延遲。
解決了時間問題,下一個問題就是我們採用何種的分布式事務演算法,最通常的就是使用 2 PC,但通常的 2 PC 演算法在一些極端情況下面會有問題,所以業界要不通過 Paxos,要不就是使用 3 PC 等演算法。在這里,TiKV 參考 Percolator,使用了另一種增強版的 2 PC 演算法。
這里先簡單介紹下 Percolator 的分布式事務演算法,Percolator 使用了樂觀鎖,也就是會先緩存事務要修改的數據,然後在 Commit 提交的時候,對要更改的數據進行加鎖處理,然後再更新。採用樂觀鎖的好處在於對於很多場景能提高整個系統的並發處理能力,但在沖突嚴重的情況下反而沒有悲觀鎖高效。
對於要修改的一行數據,Percolator 會有三個欄位與之對應,Lock,Write 和 Data:
當事務開始的時候,我們會首先得到一個 start timestamp,然後再去獲取要修改行的數據,在 Get 的時候,如果這行數據上面已經有 Lock 了,那麼就可能終止當前事務,或者嘗試清理 Lock。
當我們要提交事務的時候,先得到 commit timestamp,會有兩個階段:
『陸』 【Rust交叉編譯】cross使用較低版本的glibc
眾所周知,glibc已經成為了Linux二進製程序在各種發行版之間不兼容的重要因素了,究其原因,是glibc的版本兼容性機制。比如在高版本glibc的Linux機器上編譯和鏈接的二進制,在低版本glibc的Linux運行會報如下錯誤:
並且,glibc做靜態鏈接時會出現比較奇怪的問題(nss等),所以各發行版一致不推薦glibc靜態鏈接。那麼目前比較好的方案是,需要發行的應用,在比較低版本的glibc做編譯和鏈接。
而Rust官方提供了 cross 這個工具做交叉編譯的工作,而常用的taget x86_64-unknown-linux-gnu 的glibc版本為2.15,對於某些老到掉牙的發行版來說,可能還是會有兼容性問題,所以我基於Centos6打包了一個鏡像: https://hub.docker.com/repository/docker/jmjoy/cross ,內置的glibc版本為2.12。
使用方法:
在Cross.toml中:
『柒』 Rust之旅 linux下rust環境搭建
從今天開始,我們將開始我們的Rust語言學習之路。Rust 語言是一種高效、可靠的通用高級語言。其高效不僅限於開發效率,它的執行效率也是令人稱贊的,是一種少有的兼顧開發效率和執行效率的語言。
首先我們需要搭建好開發環境,本次選用linux作為伺服器系統,也是為以後項目環境做考慮。畢竟windows作為伺服器系統還是過於小眾。
如果您曾經安裝過 rustup,可以執行 rustup update 來升級 Rust。
在ssh界面運行以下命令:
如果您熟悉rustup安裝程序並希望自定義安裝,請選擇第二個選項。 但是,出於本教程的考慮,我們僅選擇默認的第一個選項,然後按Enter。
在 Rust 開發環境中,所有工具都安裝在 ~/.cargo/bin 目錄中,您可以在這里找到包括 rustc、cargo 和 rustup 在內的 Rust 工具鏈。
運行以下命令
運行以下命令
如果出現以下版本號則證明安裝成功
如果想卸載 Rust,您可以運行
如果想更新Rust,可以運行
『捌』 2020-12-24 (一)Rust 入坑安裝、修改國內源、使用musl、優化二進制文件等
為以往項目開發 http api ,准備使用rust開發嘗個鮮,看是否有應用到其他項目中的可能性,本系列內容均為一步一步入坑的實況,未來有時間可能整理的更為系統性,目前僅作記錄。
由於需要支持各個發行版 linux,目前的想法是採用 musl 平台編譯100%靜態鏈接的可執行文件,盡量單文件發布。
文件為靜態鏈接,未優化,包含調試信息,未經 strip,大小 3687136
優化配置完全參考 https://www.aloxaf.com/2018/09/rece_rust_size/ 此文章,在此表示感謝。
文件為靜態鏈接,包含調試信息,未經 strip,大小 1731352
文件為靜態鏈接,不包含調試信息,stripped,大小 292264
Rust 安裝、驗證完畢。
『玖』 ubuntu 20.04 +rust+vscode
如果 是 ubuntu 用戶 可以從 ubuntu 18 的版本 直接 升級 到 ubuntu,只不過 過程 比較慢 ,而且會出現升級後 一些軟體 崩潰 ,建議 備份 與 重裝
在終端中輸入 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
命令的作用是安裝 rust 提供了 三個f主要模塊
cargo, rustup, toolchains/stable-x86_64-unknown-linux-gnu
然後 ,就是配置 環境變數 ,直接修改/etc/bash.bashrc,在末尾添加,
#rust 永久有效
export CARGO_HOME="~/.cargo/"
export RUSTBINPATH="~/.cargo/bin"
export RUST="~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu"
export RUST_SRC_PATH="$RUST/lib/rustlib/src/rust/src"
export PATH=$PATH:$RUSTBINPATH
檢測
cargo -V
rustup -V
sudo dpkg -i xxx.deb,安裝vscode
好了之後 添加 插件 Rust
最後 的hello
打開終端,選擇文件夾,然後 cargo new greet 好了
『拾』 rust裡面可以使用windows系統函數嗎
時下如果語言界要評選一個網紅的話,無疑會是Rust。Rust憑借著自己出色的安全性和高效性被各大平台所接納,Linux內核,安卓底層開發,Windows底層開發相繼都採納並給出了對應的借口。微軟的Windows也是,最近發布了Rust for Windows(windows-rs) v 0.9。更新中包括全面的調用支持,Rust可以直接原生調用任何Windows API可以極大的拓展Rust在Windows下的開發能力和范圍。本文我們通過實例來學習Rust for Windows 。
概述
本次更新提供了很多新的特性和更新,根據官方的信息包括:
添加了對Win32和COM API的支持,統一了Windows板條箱。這些Windows API有新的項目win32metadata來添加。為了方便和統一,項目名稱由「Rust/WinRT」更改為「Rust for Windows」。
添加了幾個示例 ,演示了如何調用各種Windows API(包括Win32,COM和WinRT API)。
Windows 板條箱在crates.io發布,現在支持MIT或Apache雙開源版權。
內置生成的binding,無需再手動編寫。
Windows支持在Linux上構建。
Win32 API的許多改進和修復,例如對數組類型,各種字元串類型和更新的元數據的支持。
添加了對COM介面的更自然和慣用的支持,例如返回值,以及對涉及C樣式聯合和嵌套類型之類的其他API的支持。
縮短了構建時間並改善了錯誤處理。
保留原始的API大小寫,這會影響使用Windows crate的現有代碼。通過類似於QueryInterface的函數轉換為通用函數,從而可以更安全,更方便地調用許多與COM相關的函數。
環境配置
Window板條箱使用需要首先要在Windows下配置Rust開發環境,還在Rust環境的安裝也非常簡單傻瓜化。
安裝rustup
首先從Rust官方(rust-lang.org)下載安裝包rustup-init.exe(記得下載當前Windows對應的32位或者64位版本)。
然後直接執行安裝包,安裝程序為自動配置好系統路徑,以後就可以直接在命令行下使用了,比如cargo包管理器。
安裝C++ build tools
Windows下的rust編譯還依賴Microsoft C++ build tools工具,不安裝,後面在編譯時,會報錯說「link.exe」無法找到。
需要從微軟VS下載出下載vs_buildtools,選中C++工具和Windows SDK組件並安裝。
安裝VS Code及其Rust插件
另外,為了方便一般建議安裝VS Code及其Rust插件:
crates-io國內源
配置Rust 板條箱的國內源,由於官方crates-io國內下載太慢,甚至容易失敗,所以先配置國內源(比如ustc)
在用戶目錄C:\Users\CC\.cargo創建一個config文件,內容配置為:
示例
首先,通過cargo創建一個新的Rust項目:
cargo new hello-chongchong
以上命令這將創建一個新目錄並hello-chongchong創建基本項目框架目錄和文件。
進入該目錄,並使用--lib 命令嵌套創建依賴的庫項目:
cargo new --lib bindings
然後通過
code .
在VS Code打開該項目,截圖如下:
修改項目Cargo.toml文件中,添加以下依賴項,依賴項告訴Cargo現在它依賴於新創建的win庫。
[dependencies]
bindings = {path = " bindings"}
現在,在win文件夾下的Cargo.toml文件中,添加對Windows板條箱的依賴項,版本指定為最新的0.9.1。這樣就可以通過允許Cargo打包下載,構建和緩存Windows支持。
[dependencies]
windows = "0.9.1"
[build-dependencies]
windows = "0.9.1"
然後在bindings目錄下創建一個新的源文件build.rs,並輸入一下源碼:
// build.rs
fn main() {
windows::build!(
Windows::Win32::WindowsAndMessaging::MessageBoxA
);
}
在代碼中,使用 windows::build 宏指定要使用的類型,可以再次列出需要使用的所API,Windows板條箱將直接元數據生成必要的綁定。
然後修改win/src目錄中為以下代碼:
windows::include_bindings!();
這樣,就可以在主項目main.rs文件中,任意調用指定的Windows API。此處我們創建一個「Hello Chongchong!」消息對話框。
use bindings::Windows::Win32::WindowsAndMessaging::{MessageBoxA, MESSAGEBOX_STYLE};
fn main() {
unsafe {
MessageBoxA(None, "Hello Chongchong!", "Message", MESSAGEBOX_STYLE::MB_OK);
}
}
注意,任何Win32函數和COM介面方法,都需要用unsafe方式調用。
然後通過cargo build編譯該項目,並通過cargo run 會彈出一下對話框。
新版本的板條箱中再帶了幾個例子,可以在windows-rs項目倉庫的examples目錄。
總結
Rust for Windows 給rust在Windows開發應用帶來了福音,雖然一些API可能早就被廣泛地使用了,但是現在有了官方的支持,可以在文檔、示例和穩定性等各方面都有極大的改善。