如何在Rust中使用外部crate?

41

我正在尝试使用rust-http库,并希望将其用作小项目的基础。

我不知道如何使用通过rustpkg install <remote_url>无法安装的东西。事实上,我今天才发现rustpkg现在已经过时了。

如果我通过git clone克隆该库并运行适当的make命令来构建它,我该如何在其他地方使用它?也就是说,我如何实际使用extern crate http


小提示:extern mod 最近已更名为 extern crate - barjak
5个回答

42
自 Rust 1.0 版本发布以来,99% 的用户会使用 Cargo 来管理项目依赖。文档的 TL;DR 如下:
  1. 使用 cargo new 命令创建项目。

  2. 编辑生成的 Cargo.toml 文件,添加依赖项:

    [dependencies]
    old-http = "0.1.0-pre"
    
  3. 在您的代码中访问crate:

    Rust 2021和2018

  4. use old_http::SomeType;
    

    Rust 2015

    extern crate old_http;
    use old_http::SomeType;
    
  5. 使用cargo build来构建项目。

Cargo会管理版本,需要时构建依赖项,并向编译器传递正确的参数以链接所有依赖关系。

阅读Rust编程语言中关于使用Cargo的详细信息。Cargo book中的指定依赖项详细介绍了可以添加哪些种类的依赖项。


在现代 Rust 中,extern crate 结合 macro_use 仍然很有用:https://doc.rust-lang.org/reference/macros-by-example.html?highlight=macro_use#the-macro_use-attribute - hkBst
1
@hkBst 任何得到合理维护/更新的板条箱都会暴露出宏,可以使用正常的 use ... 语法导入。我已经好几年没有需要使用 #[macro_use] 了。 - Shepmaster
啊,我明白了。在macro_use的参考文档中加入一些关于这个的内容可能会有用吧? - hkBst

24

更新

关于现代版的Rust,请参考此答案。


原始回答

您需要向rustc传递-L标志,以将包含编译后的http库的目录添加到搜索路径中。类似于rustc -L path-to-cloned-rust-http-repo/build your-source-file.rs即可。

教程参考


注意:添加的是目录,而不是文件!比如说你有一个libhttp.dylib文件在../rust-http/target/debug目录下,那么就可以用命令rustc -L ../rust-http/target/debug your-source-file.rs进行编译。 - nalply
2
这个答案是正确的,但几乎没有现代Rust用户会遵循这些说明。相反,建议使用Cargo - Shepmaster

4

这段话与您的帖子无关,但与您的标题有关。而且与货物有关。

最佳实践:

  1. 使用名称为foo的外部crate。
use ::foo;
  1. 一个名为 foo 的模块(属于您的代码/包)
use crate::foo;

在这两种情况下,您可以使用use foo;,但这可能会导致混淆。

2

构建完成后,您可以在代码中使用常规的extern crate http;。唯一的技巧是您需要向rustc传递适当的-L标志,以告诉它在哪里找到libhttp

如果您的项目中有一个子模块在rust-http目录中,并且如果它构建到其根目录(我实际上不知道rust-http中的make将结果库放置在何处),那么您可以使用rustc -L rust-http pkg.rs构建自己的项目。通过该-L标志,您的pkg.rs中的extern crate http;行将能够在rust-http子文件夹中找到libhttp


请问如何使用 rand 运行 rustc?rustc -L rust-rand 无法正常工作。 - Dee

0

我遇到了类似的问题。最终我在我的Cargo.toml中这样做。

[dependencies]
shell = { git = "https://github.com/google/rust-shell" }

然后在我的 main.rs 中,我能够添加这个并且成功编译。请注意,在我的情况下,这个 cargo 包是一个宏。通常你不希望在 extern 调用之前加上 #[macro_use]。

#[macro_use] extern crate shell;

可以查看更多信息https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html。你能够指向分支和标签,而不是最新的当前分支。 - Kuberchaun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接