当前位置:首页 » 编程软件 » rust编译到linux

rust编译到linux

发布时间: 2022-12-17 23:25:52

‘壹’ 【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?如果出现了机器损坏等灾难情况,系统能否做的自动恢复。

  • 扩展性:当数据持续增多,能否通过添加机器就自动做到数据再次平衡,并且不影响外部服务。

  • 分布式事务:是否需要提供分布式事务支持,事务隔离等级需要支持到什么程度。

  • 上面的问题在系统设计之初,就需要考虑好,作为整个系统的设计目标。为了实现这些特性,我们就需要考虑到底采用哪一种实现方案,取舍各个方面的利弊等。

    后面,我将以我们开发的分布式 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 的开发。这时候,我们面临的第一个问题就是采用什么样的语言进行开发。当时,摆在我们眼前的有几个选择:

  • Go,Go 是我们团队最擅长的一门语言,而且 Go 提供的 goroutine,channel 这些机制,天生的适合大规模分布式系统的开发,但灵活方便的同时也有一些甜蜜的负担,首先就是 GC,虽然现在 Go 的 GC 越来越完善,但总归会有短暂的卡顿,另外 goroutine 的调度也会有切换开销,这些都可能会造成请求的延迟增高。

  • Java,现在世面上面有太多基于 Java 做的分布式系统了,但 Java 一样有 GC 等开销问题,同时我们团队在 Java 上面没有任何开发经验,所以没有采用。

  • C++,C++ 可以认为是开发高性能系统的代名词,但我们团队没有特别多的同学能熟练掌握 C++,所以开发大型 C++ 项目并不是一件非常容易的事情。虽然使用现代 C++ 的编程方式能大量减少 data race,dangling pointer 等风险,我们仍然可能犯错。

  • 当我们排除了上面几种主流语言之后,我们发现,为了开发 TiKV,我们需要这门语言具有如下特性:

  • 静态语言,这样才能最大限度的保证运行性能。

  • 无 GC,完全手动控制内存。

  • Memory safe,尽量避免 dangling pointer,memory leak 等问题。

  • Thread safe,不会遇到 data race 等问题。

  • 包管理,我们可以非常方便的使用第三方库。

  • 高效的 C 绑定,因为我们还可能使用一些 C library,所以跟 C 交互不能有开销。

  • 综上,我们决定使用 Rust,Rust 是一门系统编程语言,它提供了我们上面想要的语言特性,但选择 Rust 对我们来说也是很有风险的,主要有两点:

  • 我们团队没有任何 Rust 开发经验,全部都需要花时间学习 Rust,而偏偏 Rust 有一个非常陡峭的学习曲线。

  • 基础网络库的缺失,虽然那个时候 Rust 已经出了 1.0,但我们发现很多基础库都没有,譬如在网络库上面只有 mio,没有好用的 RPC 框架,HTTP 也不成熟。

  • 但我们还是决定使用 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。

    分布式事务

    要支持分布式事务,首先要解决的就是分布式系统时间的问题,也就是我们用什么来标识不同事务的顺序。通常有几种做法:

  • TrueTime,TrueTime 是 Google Spanner 使用的方式,不过它需要硬件 GPS + 原子钟支持,而且 Spanner 并没有在论文里面详细说明硬件环境是如何搭建的,外面要自己实现难度比较大。

  • HLC,HLC 是一种混合逻辑时钟,它使用 Physical Time 和 Logical Clock 来确定事件的先后顺序,HLC 已经在一些应用中使用,但 HLC 依赖 NTP,如果 NTP 精度误差比较大,很可能会影响 commit wait time。

  • TSO,TSO 是一个全局授时器,它直接使用一个单点服务来分配时间。TSO 的方式很简单,但会有单点故障问题,单点也可能会有性能问题。

  • 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:

  • Lock,就是要修改数据的实际 lock,在一个 Percolator 事务里面,有一个 primary key,还有其它 secondary keys, 只有 primary key 先加锁成功,我们才会再去尝试加锁后续的 secondary keys。

  • Write,保存的是数据实际提交写入的 commit timestamp,当一个事务提交成功之后,我们就会将对应的修改行的 commit timestamp 写入到 Write 上面。

  • Data,保存实际行的数据。

  • 当事务开始的时候,我们会首先得到一个 start timestamp,然后再去获取要修改行的数据,在 Get 的时候,如果这行数据上面已经有 Lock 了,那么就可能终止当前事务,或者尝试清理 Lock。

    当我们要提交事务的时候,先得到 commit timestamp,会有两个阶段:

  • 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 是否能提交成功,即使失败了,也有机制能保证数据被正常提交。

‘陆’ 【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可能早就被广泛地使用了,但是现在有了官方的支持,可以在文档、示例和稳定性等各方面都有极大的改善。

热点内容
怎么把文件上传百度云 发布:2025-07-13 11:09:18 浏览:556
光遇安卓玩家如何加苹果玩家 发布:2025-07-13 11:08:21 浏览:477
安卓哪里下载破解游戏 发布:2025-07-13 11:02:30 浏览:324
三菱如何查找未编译的程序 发布:2025-07-13 11:02:29 浏览:389
2013全国计算机二级c语言真题 发布:2025-07-13 10:58:17 浏览:174
python读取txt 发布:2025-07-13 10:56:50 浏览:641
c语言ftp服务器 发布:2025-07-13 10:56:36 浏览:413
mdb压缩 发布:2025-07-13 10:56:02 浏览:425
ftp虚拟目录上传文档 发布:2025-07-13 10:51:18 浏览:640
香港云服务器建站有用吗 发布:2025-07-13 10:46:26 浏览:435