zoukankan      html  css  js  c++  java
  • cargo

    cargo --version

    [root@bogon ~]# cargo --version
    cargo 1.47.0 (f3c7e066a 2020-08-28)
    You have new mail in /var/spool/mail/root
    [root@bogon ~]# 

    使用 cargo 创建并构建一个完整的二进制可执行程序项目

    [root@bogon data2]# mkdir rust
    [root@bogon data2]# cd rust/
    [root@bogon rust]# ls
    [root@bogon rust]# cargo new app1 --bin
         Created binary (application) `app1` package
    [root@bogon rust]# ls
    app1
    [root@bogon rust]# tree -D app1/
    app1/
    |-- [Oct 23 16:33]  Cargo.toml
    `-- [Oct 23 16:33]  src
        `-- [Oct 23 16:33]  main.rs
    
    1 directory, 2 files
    [root@bogon rust]# 

    通过上面的篇幅可知:cargo new 命令用于创建一个新项目,--bin 选项用于指示当前项目是一个 可执行的二进制程序 项目。

    在 Cargo 中,通常把一个项目称之为 crates 

    Rust 官方为 cargo 包管理器提供了中央托管网站。网站地址为 https://crates.io/。 我们可以从该网站上找到一些我们需要的第三方库或者一些有用的第三方项目。

    [root@bogon app1]# ls
    Cargo.toml  src
    [root@bogon app1]# cat Cargo.toml 
    [package]
    name = "app1"
    version = "0.1.0"
    authors = ["xxx"]
    edition = "2018"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    [root@bogon app1]# 

    二、添加项目需要的第三方依赖库

    我们的 猜数字 游戏需要生成 随机数。 但是 Rust 语言核心和 Rust 标准库都没有提供生成随机数的的方法或结构体。

    我们只能借助于 https://crates.io/ 上其它开发者提供的第三方库或 crates

    我们可以打开网站 crates.io 并在顶部的搜索中输入 rand 然后回车来查找第三方随机数生成库。

    从搜索的结果来看,由很多和随机数生成的相关库,不过我们只使用 rand

    点击搜索结果中的 rand 会跳转到 https://crates.io/crates/rand

    下图是我们需要的 随机数生成库 rand 的基本信息截图。

    external libraries

    了解了 rand 的基本信息后,我们就可以修改 Cargo.toml 添加 rand 依赖了。

    准确的说就是在 [dependencies] 节中添加 rand = "0.6.5"

    编辑完成后的文件内容如下

    [root@bogon app1]# cat Cargo.toml 
    [package]
    name = "app1"
    version = "0.1.0"
    authors = [" "]
    edition = "2018"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    rand = "0.6.5"

    三、 先预编译项目

    对于 Rust / C / C++ 这种静态语言,先预编译一下应该是一种习惯。

    因为预编译的时候会告诉我们项目配置是否正确,同时会下载第三方库,这样就可以 自动提示 了。

    使用 cargo 创建的项目,我们可以在终端里输入 cargo build 来预编译下项目。

    输出一般如下

    [root@bogon app1]# cargo build 
        Updating crates.io index
      Downloaded rand_chacha v0.1.1
      Downloaded rand_hc v0.1.0
      Downloaded rand_xorshift v0.1.1
      Downloaded rand_jitter v0.1.4
      Downloaded rand_isaac v0.1.1
      Downloaded autocfg v0.1.7
      Downloaded rand_core v0.3.1
      Downloaded rand_os v0.1.3
      Downloaded rand_pcg v0.1.2
      Downloaded rand v0.6.5
      Downloaded rand_core v0.4.2
      Downloaded 11 crates (249.3 KB) in 12.07s
       Compiling autocfg v0.1.7
       Compiling rand_core v0.4.2
       Compiling libc v0.2.79
       Compiling rand_core v0.3.1
       Compiling rand_jitter v0.1.4
       Compiling rand_isaac v0.1.1
       Compiling rand_xorshift v0.1.1
       Compiling rand_hc v0.1.0
       Compiling rand_pcg v0.1.2
       Compiling rand_chacha v0.1.1
       Compiling rand v0.6.5
       Compiling rand_os v0.1.3
       Compiling app1 v0.1.0 (/data2/rust/app1)
        Finished dev [unoptimized + debuginfo] target(s) in 1m 15s
    [root@bogon app1]# 
    [root@bogon app1]# tree -D
    .
    |-- [Oct 23 16:39]  Cargo.lock
    |-- [Oct 23 16:37]  Cargo.toml
    |-- [Oct 23 16:33]  src
    |   `-- [Oct 23 16:33]  main.rs
    `-- [Oct 23 16:39]  target
        |-- [Oct 23 16:39]  CACHEDIR.TAG
        `-- [Oct 23 16:39]  debug
            |-- [Oct 23 16:39]  app1
            |-- [Oct 23 16:39]  app1.d
            |-- [Oct 23 16:39]  build
            |   |-- [Oct 23 16:39]  libc-48c197210439ab2b
            |   |   |-- [Oct 23 16:39]  build-script-build
            |   |   |-- [Oct 23 16:39]  build_script_build-48c197210439ab2b
            |   |   `-- [Oct 23 16:39]  build_script_build-48c197210439ab2b.d
            |   |-- [Oct 23 16:39]  libc-88ca55d88ca3404d
            |   |   |-- [Oct 23 16:39]  invoked.timestamp
            |   |   |-- [Oct 23 16:39]  out
            |   |   |-- [Oct 23 16:39]  output
            |   |   |-- [Oct 23 16:39]  root-output
            |   |   `-- [Oct 23 16:39]  stderr
            |   |-- [Oct 23 16:39]  rand-17b43e1f4f338ea3
            |   |   |-- [Oct 23 16:39]  invoked.timestamp
            |   |   |-- [Oct 23 16:39]  out
            |   |   |   `-- [Oct 23 16:39]  probe0.ll
            |   |   |-- [Oct 23 16:39]  output
            |   |   |-- [Oct 23 16:39]  root-output
            |   |   `-- [Oct 23 16:39]  stderr
            |   |-- [Oct 23 16:39]  rand-89f79ead84a8ac84
            |   |   |-- [Oct 23 16:39]  build-script-build
            |   |   |-- [Oct 23 16:39]  build_script_build-89f79ead84a8ac84
            |   |   `-- [Oct 23 16:39]  build_script_build-89f79ead84a8ac84.d
            |   |-- [Oct 23 16:39]  rand_chacha-94f70950fc64093e
            |   |   |-- [Oct 23 16:39]  build-script-build
            |   |   |-- [Oct 23 16:39]  build_script_build-94f70950fc64093e
            |   |   `-- [Oct 23 16:39]  build_script_build-94f70950fc64093e.d
            |   |-- [Oct 23 16:39]  rand_chacha-973a4c4c879b0b17
            |   |   |-- [Oct 23 16:39]  invoked.timestamp
            |   |   |-- [Oct 23 16:39]  out
            |   |   |   `-- [Oct 23 16:39]  probe0.ll
            |   |   |-- [Oct 23 16:39]  output
            |   |   |-- [Oct 23 16:39]  root-output
            |   |   `-- [Oct 23 16:39]  stderr
            |   |-- [Oct 23 16:39]  rand_pcg-7736aaaf3fd4aa4e
            |   |   |-- [Oct 23 16:39]  invoked.timestamp
            |   |   |-- [Oct 23 16:39]  out
            |   |   |   `-- [Oct 23 16:39]  probe0.ll
            |   |   |-- [Oct 23 16:39]  output
            |   |   |-- [Oct 23 16:39]  root-output
            |   |   `-- [Oct 23 16:39]  stderr
            |   `-- [Oct 23 16:39]  rand_pcg-9b895cf06b89458e
            |       |-- [Oct 23 16:39]  build-script-build
            |       |-- [Oct 23 16:39]  build_script_build-9b895cf06b89458e
            |       `-- [Oct 23 16:39]  build_script_build-9b895cf06b89458e.d
            |-- [Oct 23 16:39]  deps
            |   |-- [Oct 23 16:39]  app1-edce79195f703d0b
            |   |-- [Oct 23 16:39]  app1-edce79195f703d0b.d
            |   |-- [Oct 23 16:39]  autocfg-6a5bbd19e854ddb5.d
            |   |-- [Oct 23 16:39]  libautocfg-6a5bbd19e854ddb5.rlib
            |   |-- [Oct 23 16:39]  libautocfg-6a5bbd19e854ddb5.rmeta
            |   |-- [Oct 23 16:39]  libc-fc4c843f6fca6e5f.d
            |   |-- [Oct 23 16:39]  liblibc-fc4c843f6fca6e5f.rlib
            |   |-- [Oct 23 16:39]  liblibc-fc4c843f6fca6e5f.rmeta
            |   |-- [Oct 23 16:39]  librand-99699316ef438a28.rlib
            |   |-- [Oct 23 16:39]  librand-99699316ef438a28.rmeta
            |   |-- [Oct 23 16:39]  librand_chacha-87ecff9cee2e0560.rlib
            |   |-- [Oct 23 16:39]  librand_chacha-87ecff9cee2e0560.rmeta
            |   |-- [Oct 23 16:39]  librand_core-5e310b0d7db91be2.rlib
            |   |-- [Oct 23 16:39]  librand_core-5e310b0d7db91be2.rmeta
            |   |-- [Oct 23 16:39]  librand_core-ce047d2d5f752996.rlib
            |   |-- [Oct 23 16:39]  librand_core-ce047d2d5f752996.rmeta
            |   |-- [Oct 23 16:39]  librand_hc-3cf4e841d9674c6e.rlib
            |   |-- [Oct 23 16:39]  librand_hc-3cf4e841d9674c6e.rmeta
            |   |-- [Oct 23 16:39]  librand_isaac-77b887c1d366684f.rlib
            |   |-- [Oct 23 16:39]  librand_isaac-77b887c1d366684f.rmeta
            |   |-- [Oct 23 16:39]  librand_jitter-44c930d5cf687a04.rlib
            |   |-- [Oct 23 16:39]  librand_jitter-44c930d5cf687a04.rmeta
            |   |-- [Oct 23 16:39]  librand_os-da217c76741d47d6.rlib
            |   |-- [Oct 23 16:39]  librand_os-da217c76741d47d6.rmeta
            |   |-- [Oct 23 16:39]  librand_pcg-a6bd8f47682b15bb.rlib
            |   |-- [Oct 23 16:39]  librand_pcg-a6bd8f47682b15bb.rmeta
            |   |-- [Oct 23 16:39]  librand_xorshift-306bdc86c1f9e8a3.rlib
            |   |-- [Oct 23 16:39]  librand_xorshift-306bdc86c1f9e8a3.rmeta
            |   |-- [Oct 23 16:39]  rand-99699316ef438a28.d
            |   |-- [Oct 23 16:39]  rand_chacha-87ecff9cee2e0560.d
            |   |-- [Oct 23 16:39]  rand_core-5e310b0d7db91be2.d
            |   |-- [Oct 23 16:39]  rand_core-ce047d2d5f752996.d
            |   |-- [Oct 23 16:39]  rand_hc-3cf4e841d9674c6e.d
            |   |-- [Oct 23 16:39]  rand_isaac-77b887c1d366684f.d
            |   |-- [Oct 23 16:39]  rand_jitter-44c930d5cf687a04.d
            |   |-- [Oct 23 16:39]  rand_os-da217c76741d47d6.d
            |   |-- [Oct 23 16:39]  rand_pcg-a6bd8f47682b15bb.d
            |   `-- [Oct 23 16:39]  rand_xorshift-306bdc86c1f9e8a3.d
            |-- [Oct 23 16:39]  examples
            `-- [Oct 23 16:39]  incremental
                `-- [Oct 23 16:39]  app1-1froeqw3vt1uy
                    |-- [Oct 23 16:39]  s-fsdf9f4vs4-nluwcr-3vd0m9p0cpi2j
                    |   |-- [Oct 23 16:39]  1capbncndx529ia9.o
                    |   |-- [Oct 23 16:39]  2xlne85efcng7orr.o
                    |   |-- [Oct 23 16:39]  4e6t7tsy2f7rnu07.o
                    |   |-- [Oct 23 16:39]  4l3obphrj6hgkslq.o
                    |   |-- [Oct 23 16:39]  4tchaufqhlp2f30q.o
                    |   |-- [Oct 23 16:39]  4tm5eg7kw2ktz7ht.o
                    |   |-- [Oct 23 16:39]  57s758bcpv2w4hik.o
                    |   |-- [Oct 23 16:39]  dep-graph.bin
                    |   |-- [Oct 23 16:39]  m8yt13xiixwxcbb.o
                    |   |-- [Oct 23 16:39]  query-cache.bin
                    |   `-- [Oct 23 16:39]  work-products.bin
                    `-- [Oct 23 16:39]  s-fsdf9f4vs4-nluwcr.lock
    
    21 directories, 87 files
    [root@bogon app1]# ls
    Cargo.lock  Cargo.toml  src  target
    [root@bogon app1]# tree -D -L 2
    .
    |-- [Oct 23 16:39]  Cargo.lock
    |-- [Oct 23 16:37]  Cargo.toml
    |-- [Oct 23 16:33]  src
    |   `-- [Oct 23 16:33]  main.rs
    `-- [Oct 23 16:39]  target
        |-- [Oct 23 16:39]  CACHEDIR.TAG
        `-- [Oct 23 16:39]  debug
    
    3 directories, 4 files
    [root@bogon app1]# 
    [root@bogon app1]# cargo run
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
         Running `target/debug/app1`
    Hello, world!
    [root@bogon app1]# 
    [root@bogon app1]# cat src/main.rs 
    extern crate rand;
    use rand::random;
    fn main() {
        let correct:u8 = random();
        println!("correct value is {}",correct);
        println!("Hello, world!");
    }
    [root@bogon app1]# 
    [root@bogon app1]# cargo build 
       Compiling app1 v0.1.0 (/data2/rust/app1)
        Finished dev [unoptimized + debuginfo] target(s) in 0.57s
    [root@bogon app1]# cargo run
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
         Running `target/debug/app1`
    correct value is 141
    Hello, world!
    [root@bogon app1]# 
    [root@bogon src]# mv main.rs  hell.rs
    [root@bogon src]# cd -
    /data2/rust/app1
    [root@bogon app1]# cargo build 
    error: failed to parse manifest at `/data2/rust/app1/Cargo.toml`
    
    Caused by:
      no targets specified in the manifest
      either src/lib.rs, src/main.rs, a [lib] section, or [[bin]] section must be present

    从Rust编译来理解

    https://tonydeng.github.io/2019/10/28/rust-mod/

    Rust编译器只接受一个.rs文件作为输入,并且只生成一个crate。这一点要牢记。

    生成的crate分两种,源文件中有main函数会生成可执行文件,无main函数则生成库。

    [root@bogon target]# cd ../src/
    [root@bogon src]# ls
    hell.rs
    [root@bogon src]# rustc hell.rs
    error[E0463]: can't find crate for `rand`
     --> hell.rs:1:1
      |
    1 | extern crate rand;
      | ^^^^^^^^^^^^^^^^^^ can't find crate
    
    error: aborting due to previous error
    
    For more information about this error, try `rustc --explain E0463`.
    [root@bogon src]# ls
    hell.rs
    [root@bogon src]# cat hell.rs 
    extern crate rand;
    use rand::random;
    fn main() {
        let correct:u8 = random();
        println!("correct value is {}",correct);
        println!("Hello, world!");
    }
    [root@bogon src]# 
     
    直接运行rustc时,编译器只知道命令行参数。它尤其不了解Cargo.toml,因此也不知道在哪里寻找rand库。
    
    要使用依赖项管理,您必须使用Cargo编译项目-只需使用cargo build /cargo run/ cargo test,一切就可以了。有关详细信息,请参见the Book。
    
    但是,如果您出于某些原因想要直接使用rustc,无论如何,我建议您先使用cargo检查cargo build --verbose。它将显示所有已调用的命令,使您可以检查可能要手动定义的参数。
    [root@bogon app1]# cat Cargo.toml 
    [package]
    name = "app1"
    version = "0.1.0"
    authors = ["magnate <liangeaglejun@sina.com>"]
    edition = "2018"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    rand = "0.6.5"
    [[bin]]
    name = "hell"
    path = "src/hell.rs"
    [root@bogon app1]#
    [root@bogon app1]# cargo build 
       Compiling app1 v0.1.0 (/data2/rust/app1)
        Finished dev [unoptimized + debuginfo] target(s) in 0.54s
    [root@bogon app1]# find ./ -name hell*
    ./target/debug/incremental/hell-30qb3ooyhy0ze
    ./target/debug/hell
    ./target/debug/hell.d
    ./target/debug/deps/hell-349c0a71279d712d.d
    ./target/debug/deps/hell-349c0a71279d712d
    ./src/hell.rs
  • 相关阅读:
    radio按钮组和label标签
    div布局
    bootstrap模态框使用
    bootstrap按钮组下拉菜单使用
    Bootstrap下拉菜单和导航栏的使用
    Bootstrap源码解读下拉菜单
    python中django学习2
    windows下配置桌面github
    状态模式--无尽加班何时休
    直接在安装了redis的Linux机器上操作redis数据存储类型--set类型
  • 原文地址:https://www.cnblogs.com/dream397/p/13864951.html
Copyright © 2011-2022 走看看