当前位置: 首页 > news >正文

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

在这里插入图片描述


文章目录

  • 前言
  • 一,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.52sRunning `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程序,感谢大家关注。

相关文章:

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

文章目录 前言一,Cargo介绍1,Cargo安装2,创建Rust项目2,编译项目:3,运行项目:4,测试项目:5,更新项目的依赖:6,生成项目的文档&#xf…...

全面了解CPU Profiler:解读CPU性能分析工具的核心功能与用法

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、使用3.1 通过调用系统API3.2 通过Android Stu…...

rust format!如何转义{},输出{}?

在Rust中,如果你想要在字符串中包含花括号 {} ,你需要使用双花括号 {{}} 来进行转义。这是因为单个花括号 {} 在字符串中表示占位符,用于格式化字符串。 以下是一个示例: fn main() {let text "这是一个示例: {…...

真人AI写真的制作方法-文生图换脸

AI写真最近火起来了,特别是某款现象级相机的出现,只需要上传自己的照片,就能生成漂亮的写真照,这一产品再次带火了AI绘画。今天我就来分享一个使用Stable Diffusion WebUI制作真人AI写真的方法,不用训练,快…...

vscode如何包含第三方库

方法1:使用C Extension 在include 的 rapidjson的头文件时,vscode会提示找不到的问题 悬停,点击黄色提示 Edit "includePath" setting Include Path,输入rapidjson的include路径 /Users/xxx/workspaces/rapidjson-1.1.…...

【Docker】Docker安装Consul

文章目录 1. 什么是Consul2. Docker安装启动Consul 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Consul Consul是HashiCorp公司推出的开源软件,提…...

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(20)-Fiddler精选插件扩展安装让你的Fiddler开挂到你怀疑人生

1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler&#xff0c…...

计算机top命令

top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html...

DevExpress WPF Tree List组件,让数据可视化程度更高!(二)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体,可以把数据信息显示为REE、GRID或两者的组合,在数据绑定或非绑定模式下,具有完整的数据编辑支持。 在上文中(点击这里回顾DevExpress WPF Tree …...

lc1074.元素和为目标值的子矩阵数量

创建二维前缀和数组 两个for循环,外循环表示子矩阵的左上角(x1,y1),内循环表示子矩阵的右下角(x2,y2) 两个for循环遍历,计算子矩阵的元素总和 四个变量,暴力破解的时间复杂度为O(…...

elementUi el-radio神奇的:label与label不能设置默认值

问题:最近项目遇到一个奇葩的问题:红框中列表的单选按钮无法根据需求设置默认选中,但是同样是设置开启状态的单选框可以设置默认状态 原因:开始同样是和开启/关闭状态一样也把红框中列表的默认值设置为数字模式,但是由…...

git仓库清理

关于git仓库的清理,主要就是清理git仓库里面的大的二进制文件。网上查了很多教程,很多都是用:git filter-branch.清理仓库中的大文件。 我尝试着本地测试了一下,发现是真慢呀。 方法一、git filter-branch step1:查…...

从0到1开发go-tcp框架【3-读写协程分离、引入消息队列、进入连接管理器、引入连接属性】【基础篇完结】

从0到1开发go-tcp框架【3-读写协程分离、引入消息队列、进入连接管理器、引入连接属性】 1 读写协程分离[v0.7] 添加一个Reader和Writer之间通信的channel添加一个Writer goroutineReader由之前直接发送给客户端改为发送给通信channel启动Reader和Writer一起工作 zinx/znet/co…...

python-爬虫作业

# -*- coding:utf-8 -*-Author: 董咚咚 contact: 2648633809qq.com Time: 2023/7/31 17:02 version: 1.0import requests import reimport xlwt from bs4 import BeautifulSoupurl "https://www.dygod.net/html/gndy/dyzz/" hd {user-Agent:Mozilla/4.0 (Windows N…...

vue3+ts+pinia整合websocket

文章目录 一. 目标二. 前置环境三. websocket通用模板 一. 目标 先有实时数据需要展示. 由于设备量极大且要对设备参数实时记录展示.axios空轮询不太适合. 选择websocket长连接通讯. 使用pinia原因是pinia具备共享数据性质.可以作为消息队列缓存数据,降低渲染压力.同时方便多…...

【微信小程序】保存多张图片到本地相册

<template><view class"container"><u-swiper :list"list" circular radius0 indicator indicatorModedot height950rpx></u-swiper><view class"btn btn2" click"saveFun">保存到相册</view><…...

Python Numpy入门基础(二)数组操作

入门基础&#xff08;二&#xff09; NumPy是Python中一个重要的数学运算库&#xff0c;它提供了了一组多维数组对象和一组用于操作这些数组的函数。以下是一些NumPy的主要特点&#xff1a; 多维数组对象&#xff1a;NumPy的核心是ndarray对象&#xff0c;它是一个多维数组对…...

【LeetCode每日一题】——1572.矩阵对角线元素的和

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…...

牛客网Verilog刷题——VL55

牛客网Verilog刷题——VL55 题目答案 题目 请用Verilog实现4位约翰逊计数器&#xff08;扭环形计数器&#xff09;&#xff0c;计数器的循环状态如下&#xff1a;   电路的接口如下图所示&#xff1a; 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clkwireInput1系统…...

python中数据可视化

1.掷一个D6和一个D10 50000次的结果 die.py from random import randintclass Die:def __init__(self, num_sides6):self.num_sides num_sidesdef roll(self):return randint(1, self.num_sides) die_visual.py from die import Die from plotly.graph_objs import Bar, L…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...