在Win下编译适用于Linux的Rust程序

最近在尝试在 Windows11 下编译 Linux 可用的程序时遇到了不少问题,我这里总结一个简单的编译方法供大家参考(不过现在都有WSL了,是不是直接在上面编译更好?)

具体方法

安装工具链

rustup target add x86_64-unknown-linux-musl 使用 musl 进行静态连接工具链
你可以使用rustup target list指令来检查自己是否装好了工具链
检查工具链

修改 Cargo 配置

在 ~/.cargo/config.toml (如果没有请自己创建) 内加上

1
2
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"

Cargo配置

进行编译和测试

使用cargo build --target=x86_64-unknown-linux-musl就可以进行编译你的项目了,或者也可以用cargo build --target x86_64-unknown-linux-musl --release来构建 release 模式的
进行编译
可见,很快就编译好了,下面我使用 WSL2 运行该程序测试正确性,代码如下(虽然这个不重要)
程序代码
运行结果如下
运行结果
可见,一切顺利,结束!

Rust萌新之路-变量、函数和判断

我推荐的布局介绍

我推荐使用 Vscode 再安装 Rust-Analyzer 插件进行刷题,记得在开刷之前先执行 rustlings lsp 来启用语法提示,下面给大家看看各个布局窗口的作用
在命令行运行rustlings指令
1号区域是终端,我在里面启动了 rustlings watch 来检查进度,2号区域是各个题目(所有的题目都在 exercises 文件夹内),3号区域就是代码编辑框了,这样简简单单就可以开始了

Intro 和 Variables

Intro 部分其实没什么好看的,主要是教你如何使用 Rustlings ,在终端中提示通过编译后,你把注释中的 // I AM NOT DONE 删掉就可以了

Variables 里面的东西也比较简单,主要就是考变量的初始化语法、未初始化不能使用、如何创建可变变量、重新申明变量、常量必须指明类型这些,基本上没有什么问题,就不赘述了。

Functions 和 If

Functions 内的内容也比较基础,主要考察了函数的创建、参数的定义和传入、返回值的定义方式、通过去掉分号来返回一个值
很轻松就能解决这一块,我也认为这一块不会出现什么问题,也不多讲了。

If 的第一题体现了我很喜欢的一点,就是 Rust 中的 if 语句是有返回值的,同样可以用去掉分号来表示返回,整体也可以作为函数的返回值,因此这题我的答案是这样的

1
2
3
4
5
6
7
pub fn bigger(a: i32, b: i32) -> i32 {
if a>b {
a
}else {
b
}
}

第二题也类似,答案如下

1
2
3
4
5
6
7
8
9
pub fn foo_if_fizz(fizzish: &str) -> &str {
if fizzish == "fizz" {
"foo"
} else if fizzish == "fuzz" {
"bar"
}else {
"baz"
}
}

不过这里其实有一个比较有意思的地方,返回值是一个&str,新手可能会忘记为什么这里不需要标注生命周期,请让我来解释一下,这是因为这个函数满足了生命周期省略规则,我认为这里满足的是“如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数”,所以我觉得函数签名应该等价于 pub fn foo_if_fizz<'a>(fizzish: &'a str) -> &'a str ,不过考虑到字符串字面量的生命周期是 'static ,我认为这里也可以是 pub fn foo_if_fizz(fizzish: &str) -> &'static str,具体是什么样希望能有大神指出。

Quiz1

终于到了第一个小测验了,这也会是第一篇的最后一题,这是关于上面的 Variables、Functions 和 If 的测验。
对于写完前面的你应该算是简简单单

1
2
3
4
5
6
7
fn calculate_price_of_apples(num:i32)->i32{
if num>40{
num
}else{
num*2
}
}

本章到此就结束了

有用的其他参考

Rust萌新之路-Rustlings的安装

专栏简介

我学习 Rust 已经有一小段时间了,Rustling 这个项目我认为是新手学完Rust基本语法,或者在看完 The Book (中文版) 后,一个很适合的练习题组,这个项目提供了75道 Rust 语言的小题目,提供了方方面面的考验,对于绝大多数题目也都有足够的提示,但是鉴于我没有找到使用中文介绍这些题目的文章,便打算自己开一篇介绍和讲解,本人有的实现可能不够好,或者讲解有谬误,希望各位斧正。

安装 Rustlings

既然你已经开始想要写 Rust 练习题,那么你应该已经安装过Rust了,就不做多的介绍了,如果你还没有安装,请参考官方的这个页面,可以先安装Visual Studio最新版后,勾选适用于桌面的C++开发,然后安装 Rustup 等工具。

接下来,打开 Rustlings 官方仓库 ,里面介绍了安装的方式,在 Mac OS 或者 Linux 操作系统上,安装 Rustlings 是很简单的

1
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash

使用这个命令就可以把它安装到你的电脑上,之后就可以使用 Rustlings 指令了。至于 Windows 下稍微复杂一点,你需要先激活 Powershell 的脚本运行权限,然后就可以运行安装指令了

1
2
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1

如果你不喜欢上面的安装方式,也可以手动安装,也没多麻烦,先下载这个 git 仓库,然后在里面运行 cargo install –path . 就行了,我使用 git clone 进行下载,指令可以参考如下(可以把5.2.1替换成最新版本)

1
2
3
git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
cargo install --force --path .

这样,你就完成了 rustlings 的安装,尝试在命令行运行 rustlings ,它会给你反应

在命令行运行 rustlings 指令

基础使用

其实需要做的操作很少,你如果只是做题的话在 rustlings 目录下使用 rustlings watch 就够了,以下内容主要是我对官方操作解释的翻译(注意,你的指令一定要在 rustlings 目录下运行,不要到上级或者子目录)

你要做的所有题目都在 rustlings/exercises/ 文件夹里,当你想以官方推荐的顺序来做的话,运行

1
rustlings watch

它会持续按顺序检查题目,并且给出错误(每当你编辑过之后),你需要修好错误或者使代码通过编译,它就会进入下一个题目,直到所有题目完成,或者你关闭了它,如果你只想运行一次而非持续运行,你可以允许下一条指令

1
rustlings verify

如果你想手动指定它检查的题目,你可以用 run 指令

1
rustlings run 测试名

或者使用 run next 来检查下一个的

1
rustlings run next

当你遇到了不会的题目,需要一定帮助时,可以使用 hint 指令,它的用法和 run 差不多,可以指定名字或者使用 next 来查找下一个

1
2
rustlings hint myExercise1
rustlings hint next

list 指令可以用于检查你的进度

1
rustlings list

例如我的输出就是都做完了

我运行 rustlings list 的结果

另外有一个非常重要的,就是你会发现你在编辑时无法使用 Rust-Analyzer ,这怎么行?启用的方法官方仓库也有给出,就是运行

1
rustlings lsp

另外,卸载的方法如下:

  1. 先删除 rustlings 所在的文件夹
  2. 运行 cargo uninstall rustlings

有用的其他参考

Hello World

欢迎来到 Sworld 的博客主页!
本站正在建设,请往下翻以查看更多文章!

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.