当前位置: 首页 > 知识库问答 >
问题:

包含库和二进制文件的包?

颛孙安康
2023-03-14

我想制作一个Rust包,它既包含一个可重用库(大部分程序都在这里实现),也包含一个使用它的可执行文件。

假设我没有混淆 Rust 模块系统中的任何语义,我的 Cargo.toml 文件应该是什么样子的?

共有3个答案

龚星洲
2023-03-14

另一种解决方案是不要尝试将两者都塞进一个包中。对于具有友好可执行文件的稍大的项目,我发现使用工作区非常好。

在这里,我创建了一个二进制项目,其中包含一个库,但是有许多可能的方法可以组织代码:

 % tree the-binary
the-binary
├── Cargo.toml
├── src
│   └── main.rs
└── the-library
    ├── Cargo.toml
    └── src
        └── lib.rs

Cargo.toml

这使用 [workspace] 键,并取决于库:

[package]
name = "the-binary"
version = "0.1.0"
edition = "2018"

[workspace]

[dependencies]
the-library = { path = "the-library" }

src/main.rs

fn main() {
    println!(
        "I'm using the library: {:?}",
        the_library::really_complicated_code(1, 2)
    );
}

图书馆/Cargo.toml

[package]
name = "the-library"
version = "0.1.0"
edition = "2018"

-库/src/lib.rs

use std::error::Error;

pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<dyn Error>> {
    Ok(a + b)
}

并执行它:

% cargo run -q
I'm using the library: Ok(3)

这项计划有两大好处:

>

  • 二进制文件现在可以使用仅适用于它的依赖项。例如,您可以包含大量板条箱来改善用户体验,例如命令行解析器或终端格式化。这些都不会“感染”库。

    工作区防止每个组件的冗余构建。如果我们在<code>库</code>和<code>二进制</code>目录中同时运行<code>cargo build</code>,库不会同时生成-它在两个项目之间共享。

  • 潘宝
    2023-03-14

    创建一个<code>src/main。rs,将用作实际可执行文件。您不需要修改货物。toml,该文件将被编译为与库同名的二进制文件。

    项目内容:

    % tree
    .
    ├── Cargo.toml
    └── src
        ├── lib.rs
        └── main.rs
    

    Cargo.toml

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

    资源中心/图书馆

    use std::error::Error;
    
    pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<dyn Error>> {
        Ok(a + b)
    }
    

    src/main.rs

    fn main() {
        println!(
            "I'm using the library: {:?}",
            example::really_complicated_code(1, 2)
        );
    }
    

    并执行它:

    % cargo run -q
    I'm using the library: Ok(3)
    

    如果希望控制二进制文件的名称或拥有多个二进制文件,可以在< code>src/bin中创建多个二进制源文件,在< code>src中创建其余的库源文件。你可以在我的项目中看到一个例子。您根本不需要修改< code>Cargo.toml,并且< code>src/bin中的每个源文件都将被编译成同名的二进制文件。

    项目内容:

    % tree
    .
    ├── Cargo.toml
    └── src
        ├── bin
        │   └── mybin.rs
        └── lib.rs
    

    Cargo.toml

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

    资源中心/图书馆

    use std::error::Error;
    
    pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<dyn Error>> {
        Ok(a + b)
    }
    

    src/bin/mybin.rs

    fn main() {
        println!(
            "I'm using the library: {:?}",
            example::really_complicated_code(1, 2)
        );
    }
    

    并执行它:

    % cargo run --bin mybin -q
    I'm using the library: Ok(3)
    

    另请参阅:

    • 如何指定默认情况下在货物工作区的根目录中运行哪个板条箱“货物运行”
    子车英达
    2023-03-14
    Tok:tmp doug$ du -a
    
    8   ./Cargo.toml
    8   ./src/bin.rs
    8   ./src/lib.rs
    16  ./src
    

    Cargo.toml:

    [package]
    name = "mything"
    version = "0.0.1"
    authors = ["me <me@gmail.com>"]
    
    [lib]
    name = "mylib"
    path = "src/lib.rs"
    
    [[bin]]
    name = "mybin"
    path = "src/bin.rs"
    

    SRC/lib.rs:

    pub fn test() {
        println!("Test");
    }
    

    SRC/bin.rs:

    extern crate mylib; // not needed since Rust edition 2018
    
    use mylib::test;
    
    pub fn main() {
        test();
    }
    
     类似资料:
    • 我想编译一个CSV文件到我的二进制,以便当我运行我的EXE应用程序时,它不需要文件夹中所需的CSV文件,并且已经在EXE中拥有CSV文件数据。 例如,我有多个CSV文件,包含2列和150行字符串,我想在运行时将其解析成C映射。当我使用这个应用程序,我不希望它是在一个文件夹与多个CSV文件,而只是EXE可以更便携。如果这些CSV文件中的数据必须更改,那么我只需用更新的CSV文件重新构建解决方案。 C

    • 我有一个包含一些二进制值的整数列表 打印时的列表如下: 我如何将列表分解为8位并将那8位转换为十六进制?

    • 我想将python的输出打印到控制台和一个包含错误(如果有的话)的文本文件。 到目前为止,我的尝试是: 注意:生成可执行文件hello的代码 相关链接: 如何使用python将“print”输出重定向到文件? http://linux.byexample.com/archives/349/how-to-redirect-output-to-a-file-as-well-as-display-it-

    • Python 不仅支持文本文件的读写,也支持二进制文件的读写,比如图片,声音文件等。 读取二进制文件 读取二进制文件使用 ‘rb’ 模式。 这里以图片为例: with open('test.png', 'rb') as f: image_data = f.read() # image_data 是字节字符串格式的,而不是文本字符串 这里需要注意的是,在读取二进制数据时,返回的数据是字

    • 使用称为二进制的数据结构来存储大量原始数据。 二进制文件以比列表或元组更加节省空间的方式存储数据,并且运行时系统针对二进制文件的有效输入和输出进行了优化。 二进制文件以整数或字符串的顺序编写和打印,用小于或大于括号的双精度括起来。 以下是Erlang中二进制文件的示例 - 例子 (Example) -module(helloworld). -export([start/0]). start()

    • Blob对象 FileList对象 File对象 FileReader对象 综合实例:显示用户选取的本地图片 URL对象 参考链接 历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript 5引入