【ChatGPT辅助学Rust | 基础系列 | Cargo工具】Cargo介绍及使用

news2024/9/22 11:23:23

在这里插入图片描述


文章目录

  • 前言
  • 一,Cargo介绍
    • 1,Cargo安装
    • 2,创建Rust项目
    • 2,编译项目:
    • 3,运行项目:
    • 4,测试项目:
    • 5,更新项目的依赖:
    • 6,生成项目的文档:
  • 二,Cargo常用命令
  • 三,Cargo常用参数
  • 总结


前言

在编程世界中,工具的选择与使用同样重要,甚至有时候比编程语言本身更为重要。对于Rust来说,Cargo就是这样一款强大的工具。本文将详细介绍Cargo的各项功能,并通过实例演示如何使用这些功能。希望通过本文,读者能够熟练掌握Cargo的使用,从而更好地进行Rust开发。


一,Cargo介绍

Cargo是Rust的官方构建工具和包管理器,它的出现极大地提升了Rust的易用性和开发效率。无论是创建新的Rust项目,还是管理项目的依赖,Cargo都能提供极大的便利。

1,Cargo安装

在安装Rust时,Cargo也会被一同安装。可以通过在终端中输入以下命令来验证Cargo的安装:

cargo --version

如果Cargo已经成功安装,该命令将会输出Cargo的版本信息。
在这里插入图片描述

2,创建Rust项目

创建新的Rust项目是Cargo的一个基本功能。在终端中,运行以下命令:

cargo new my_project

这将创建一个名为my_project的新项目,其中包含了基本的目录结构和一个简单的"Hello, World!"程序。项目的目录结构如下:

my_project
├── Cargo.toml
└── src
    └── main.rs

在这个目录结构中,Cargo.toml是项目的配置文件,src目录是源代码的存放位置,main.rs是主程序文件。

Cargo.toml文件是Cargo的配置文件,它定义了项目的名称,版本,作者等信息,以及项目的依赖。一个基本的Cargo.toml文件如下:

[package]
name = "my_project"
version = "0.1.0"
edition = "2018"

[dependencies]
  • 在[package]部分,定义了包的基本信息,如名称,版本和Rust的版本。
  • 在[dependencies]部分,列出了项目的依赖。如果项目需要使用其他的Rust库,可以在这里添加。

src/main.rs文件是项目的主程序文件。在一个新创建的项目中,它包含一个简单的"Hello, World!"程序:

fn main() {
    println!("Hello, World!");
}

2,编译项目:

编译Rust项目是Cargo的一个基本功能。在终端中,只需运行cargo build命令,Cargo就会编译当前目录下的Rust项目。如果项目有未下载的依赖,Cargo会自动下载并编译它们。

cargo build

这个命令会在项目的根目录下生成一个名为target的文件夹,其中包含了编译生成的二进制文件和库文件。默认情况下,这个命令会以debug模式进行编译,这意味着编译出的程序包含了调试信息,但是没有进行优化。

如果想要编译出一个用于发布的、优化过的程序,可以使用cargo build --release命令。这个命令会以release模式进行编译,编译出的程序进行了优化,运行速度更快,但是不包含调试信息。

cargo build --release

在release模式下编译的程序会被放在target/release目录下,而在debug模式下编译的程序则会被放在target/debug目录下。

值得注意的是,编译Rust项目可能需要一些时间,特别是在第一次编译或者在添加了新的依赖之后。但是,Cargo会缓存编译结果,所以在没有修改代码或者依赖的情况下,再次编译会非常快。

3,运行项目:

cargo run命令是Cargo的一个重要命令,它的作用是编译并运行Rust项目。这个命令会先检查源代码是否有更改,如果有更改,它会先编译项目,然后运行编译后的程序。

例如,假设有一个名为"my_project"的Rust项目,项目的主程序在"src/main.rs"文件中。在项目的根目录下运行cargo run命令,Cargo会编译并运行这个项目。

cargo run

如果编译成功,会看到类似以下的输出:

   Compiling my_project v0.1.0 (/path/to/my_project)
    Finished dev [unoptimized + debuginfo] target(s) in 0.52s
     Running `target/debug/my_project`
Hello, world!

这里,"Hello, world!"是"src/main.rs"文件中程序的输出。

如果源代码没有更改,cargo run命令会直接运行已经编译好的程序,而不会再次编译。这可以节省不必要的编译时间。

cargo run命令还可以接受命令行参数。这些参数会被传递给Rust程序。例如,如果Rust程序需要一个文件名作为参数,可以这样运行:

cargo run filename.txt

这里,"filename.txt"是传递给Rust程序的参数。

4,测试项目:

在Rust中,测试是一种非常重要的编程实践,可以帮助开发者确保代码的正确性和稳定性。Cargo提供了一种简单的方式来创建和运行测试。

在Rust中,测试通常写在源代码文件中,位于特殊的#[cfg(test)]模块内,这个模块只在运行cargo test命令时被编译和运行。在这个模块内,每一个以#[test]属性标记的函数都是一个测试函数,Cargo会自动找到并运行这些测试。

例如,以下是一个简单的测试:

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}

在这个例子中,it_works函数是一个测试,它检查2 + 2是否等于4。如果等于4,测试就会通过;如果不等于4assert_eq!宏会引发一个panic,测试就会失败。

要运行测试,只需要在终端中输入cargo test命令。Cargo会自动找到并运行所有的测试,然后报告测试结果。

cargo test

除了基本的测试外,Rust还支持更复杂的测试形式,如集成测试、文档测试等。集成测试是在tests目录下的独立文件中编写的,用于测试库的公有接口是否正确。文档测试则是在文档注释中编写的,可以同时作为示例代码和测试。

5,更新项目的依赖:

在Rust项目中,依赖是非常重要的一部分。这些依赖,也被称为crate,是Rust的库或者包,可以被其他项目引用和使用。在Rust项目中,所有的依赖都会在Cargo.toml文件中的[dependencies]部分进行声明。

例如,如果项目需要使用到名为"rand"的库,可以在Cargo.toml文件中添加如下内容:

[dependencies]
rand = "0.8.3"

在添加了新的依赖后,运行cargo build命令,Cargo会自动下载并编译所需的依赖。

6,生成项目的文档:

生成项目文档是Cargo的一项重要功能。Rust的文档生成工具叫做rustdoc,它可以从Rust源代码中提取文档注释并生成HTML文档。Cargo提供了一个方便的命令cargo doc来调用rustdoc并生成项目的文档。

在Rust中,可以使用三个斜杠///来为函数、结构体、模块等添加文档注释。例如:

/// 这是一个示例函数。
///
/// # Examples
///
/// ```
/// let result = my_project::example_function(5);
/// assert_eq!(result, 10);
/// ```
pub fn example_function(x: i32) -> i32 {
    x * 2
}

在这个例子中,example_function函数有一个文档注释,注释中还包含了一个示例代码块。

当在项目的根目录下运行cargo doc命令时,Cargo会调用rustdoc来为项目生成文档。生成的文档会放在target/doc目录下,每个库都会有一个对应的HTML文件。

cargo doc

如果想要在生成文档后立即在浏览器中打开它们,可以使用cargo doc --open命令。

在生成的文档中,可以看到所有公共项的文档注释,以及它们的类型签名和源代码。如果文档注释中包含了示例代码块,rustdoc还会自动测试它们,以确保示例代码的正确性。

总的来说,Cargo和rustdoc为Rust项目的文档生成提供了强大的支持,使得在Rust项目中维护和查阅文档变得非常方便。
在这里插入图片描述


二,Cargo常用命令

以下是Cargo的一些常用命令及其作用,它们可以帮助你更好地管理和构建Rust项目:

命令作用
cargo new NAME创建一个新的Rust项目
cargo build编译当前目录下的Rust项目
cargo run编译并运行当前目录下的Rust项目
cargo test运行当前目录下Rust项目的所有测试
cargo check检查代码是否可以编译,但不生成可执行文件
cargo clean清理项目,删除target目录及其内容
cargo doc为当前目录下的Rust项目生成文档
cargo update更新当前目录下Rust项目的所有依赖
cargo install NAME安装指定的crate到系统
cargo publish发布crate到crates.io
cargo search TERM在crates.io上搜索crate
cargo bench运行项目的基准测试
cargo login TOKEN登录到crates.io
cargo owner管理crate的所有者
cargo package打包一个crate以发布
cargo uninstall从系统中卸载一个crate
cargo version显示Cargo的版本信息

三,Cargo常用参数

以下是Cargo命令的一些常用参数及其作用:

参数作用
--verbose-v显示更多的输出信息
--release编译优化后的版本,而不是默认的调试版本
--bin NAME指定要编译或运行的二进制文件
--example NAME编译或运行项目中的示例代码
--features "FEATURES"启用指定的特性
--no-default-features禁用默认的特性
--all-features启用所有的特性
--target TRIPLE指定编译的目标平台
--manifest-path PATH指定Cargo.toml的路径
--jobs N并行运行的编译作业的数量
--frozen禁止更新Cargo.lock或下载依赖
--locked如果Cargo.lock需要更新,则失败
--offline禁止访问网络

总结

在本文中,我们详细探讨了Cargo的各种功能和使用方法。通过实例演示,我们了解了如何使用Cargo来创建新的Rust项目,如何管理项目的依赖,以及如何使用Cargo来编译和运行Rust代码。希望这些内容能够帮助读者更好地理解和使用Cargo,从而更有效地进行Rust开发。记住,熟练掌握工具的使用,是提升编程效率的关键。在未来的Rust学习和开发中,希望Cargo能成为你的得力助手。

下一章我们将编写并运行第一个Rust程序,感谢大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/824184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go学习第二天

Defer语句调用顺序 package mainimport "fmt"func main() {defer fmt.Println("main end1 先进后出")defer fmt.Println("main end2 后进先出")fmt.Println("main hello go 1")fmt.Println("main hello go 2") }重点&…

Android性能优化—LeakCanary内存泄漏检测框架分析。

一、什么叫内存泄漏、内存溢出? 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个10M的Bitmap,但系统分配给APP的连续内存不足10M&#xff0c…

Cpp7 — 继承和多态

继承 -------- 面向对象的三大特性之一 面向对象的三大特性:封装、继承、多态 封装:把数据和方法都封装在一起,想给你访问的变成共有,不想给访问的,写成私有。 继承:继承是类设计层次的复用 多态&#…

物联网远程智能控制设备——开关量/正反转百分比控制

如今生产生活的便利性极大程度上得益于控制技术的发展,它改变了传统的工作模式,并将人们从【纯劳力】中解放出来。如今,随着科学技术的进步,控制器的种类及应用领域也越来越多。 物联网远程智能控制设备就是一种新型的、能够用于…

VSCode自定义闪烁光标

打开VSCode 组合键ctrlshiftp搜索"settings.json",打开User Settings 加上这一句 "editor.cursorStyle": "block","workbench.colorCustomizations": {"editorCursor.foreground": "#5c8fb1","terminalCurs…

拓数派入选中国信通院 “铸基计划”「高质量数字化转型产品及服务全景图」

7 月 27 日,由中国信息通信研究院(以下简称 “中国信通院”)主办的 “2023 数字生态发展大会” 暨中国信通院 “铸基计划” 年中会议在京召开,本次大会深度展示了中国信通院在数字化领域的工作成果,并正式发布了《高质…

HCIP BGP概念、工作原理、特点总结

BGP概念 BGP---边界网关路由协议,无类别的路径矢量EBP协议 BGP类别的路由协议,用于AS与AS间进行路由条目共享; AS指的是在同一个组织管理下,使用统一选路策略的设备集合,不同AS号通过AS号来区分,AS号存在…

小程序如何上传商品图片

了解如何在小程序商城中上传商品图片是非常重要的,因为商品图片的质量和展示效果直接影响到用户对商品的购买决策。下面,我将介绍怎么在小程序上传产品图片的方法和注意事项。 1. 图片准备:在上传商品图片之前,首先要准备好商品图…

Android手机使用无线调试进行adb连接

平时进行真机调试apk的时候,总是要插着数据线,比较麻烦,而使用无线调试就可以方便的进行连接,步骤如下: 1、进入设置找到开发者选项 2、打开开发者选项中的无线调试 3、使用配对码进行配对,输入命令&…

IDEA中修改代码中注释的字体颜色

IDEA中修改代码中注释的字体颜色 一、修改文档注释的字体颜色 选择File--Settings--Color Scheme--Language Defaults,可以修改单行注释的字体颜色,多行注释的字体颜色以及文档注释的颜色,我一般习惯将文档注释和多行注释设置成绿色 008017…

运用大数据软件提高竞彩足球胜平负分析的准确率

竞彩足球是一种以足球比赛结果为基础的体育游戏,它吸引了众多热爱足球的球迷和彩票爱好者的参与。然而,要在竞彩足球中取得最佳的胜平负预测结果并非易事。幸运的是,随着大数据技术的不断发展和应用,我们可以利用大数据软件来提高…

这次,常温超导能否变为现实?

关注科研和技术的朋友近几天应当都听到韩国研发常温超导材料的消息了,作为攻城狮的我自然也是非常感兴趣,经过一番思想斗争还是放下了手上的单片机,想要一看这个常温超导的究竟,毕竟印象之中之前已经搞过好几次乌龙了。常温超导要…

overpass-turbo下载铁路线

overpass turbo /* This has been generated by the overpass-turbo wizard. The original search was: “road” */ [out:json]; rel(198494); out body; >; out skel qt; 上面的198498代表在osm中铁路线的id,这个id获取流程是从osm网站查询出来的 我也没啥好…

MPAndroidCahrt_linechart折线图实现读取本地文件生成曲线

目录 标题(Description)设置图例(Legend)设置(部分和标题一样的没写)X轴(XAxis)设置(上面有的属性不再写了)数据源(LineData)设置MainActivity 注释部分可以删掉,看需不需要效果如下,目前实现基本的读取数据生成曲线,可以正常运行 还有很多bug,比如生成一个数据在生成另…

(二)创建streamlit的第一个应用

1 前言 📣 重要通知!在我之前的博客中,曾经介绍过Streamlit的安装方法和初步应用。如果你还没有参阅过,请先阅读这篇文章,它为我们接下来的探索铺垫了基础。🔍😊 (一) 初识Streamlit——安装以…

Nodejs 第二章(安装)

安装nodejs 访问官网 en https://nodejs.org/en cn http://www.nodejs.com.cn/ LTS 长期支持版 Current 尝鲜版 选择自己的操作系统 windows Mac Linux windows需要区分64位和32位 Mac需要区分64位还是ARM芯片 Linux同上。 其中msi 和 pkg 可以直接安装较为简单 Mac Pkg wi…

小型双轮差速底盘寻迹功能的实现

1. 功能说明 寻迹机器人是一种能够跟踪特定物体或线路的机器人。它们通常具有以下功能和特点: ① 传感器:寻迹机器人配备了用于感知环境的传感器,如摄像头、灰度传感器等。这些传感器可以探测地面上的标记、颜色、纹理或其他特定特征&#xf…

Vue3和TypeScript项目-移动端兼容

1 全局安装typescript 2 检测安装成功 3 写的是ts代码,但是最后一定要变成js代码,才能在浏览器使用 这样就会多一个js文件 3 ts语法 数组语法 对象语法 安装vue3项目 成功后进入app。安装依赖。因为我们用的是脚手架,要引入东西的时候不需要…

网格简化(QEM)学习笔记

文章目录 网格简化(QEM)1 概述与原理1.1 网格简化的应用1.2 常见的简化操作1.3 二次误差度量 2 算法流程2.1 逐步分析 3 Python代码实现3.1 测试结果 4 总结参考 网格简化(QEM) 1 概述与原理 网格简化,通过减少复杂网格数据的顶点、边和面的数量简化模型的表达&am…

MIT 6.S081 Lab Ten -- mmap

MIT 6.S081 Lab Ten -- mmap 引言mmap(hard)代码解析 引言 本文为 MIT 6.S081 2020 操作系统 实验十解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系列 mmap(hard) map和munmap系统调用允许UNIX程序对其地址空间进行详细控制。它们可用于在进程之间共享内存&a…