36

我想cfg用 Cargo 有条件地编译我的源代码,谷歌搜索了一段时间后,似乎解决方案是使用cargo --features.

http://doc.crates.io/manifest.html

我尝试添加一些

#[cfg(feature = "foo")]

在源代码和

cargo build --features foo

,但它说

Package `xxx v0.0.1 (file:///C:/yyy/xxx)` does not have these features: `foo`

如何让货物识别特征?我必须添加一些东西Cargo.toml吗?

这是我正在使用rustc的版本:cargo

C:\>rustc --version
rustc 0.13.0-nightly (42deaa5e4 2014-12-16 17:51:23 +0000)

C:\>cargo --version
cargo 0.0.1-pre-nightly (5af754d 2014-12-18 01:50:48 +0000)
4

2 回答 2

36

您必须在Cargo.toml.

我能够通过执行以下操作有条件地编译:

  • Cargo.toml中,创建一个features部分并引入某个特征名称:

    [features]
    
    customfeature = [] # feature has no explicit dependencies
    

    如果您希望您的功能具有特定的依赖关系,请查看文档中的示例

  • 在您的代码中,使用#[cfg(feature="customfeature")]

  • cargo build --features customfeature

由于您的步骤 2 和 3 似乎很好,因此您的Cargo.toml.

于 2014-12-24T09:09:52.863 回答
9

如其他答案所述,您可以使用features它。我想补充一点,这些功能不仅允许您有条件地编译部分代码,而且还可以有条件地包含可能是该代码一部分的依赖项。考虑以下片段:

您可以使用其他答案中已描述的功能标志激活条件代码:

cargo build --features customfeature

您需要将条件代码标记为仅在customfeature启用时才存在:

#[cfg(feature = "customfeature")]
fn my_func() {
    my_optional_dependency::do_something(); 
}

// This includes dependencies only when customfeature is enabled
#[cfg(feature = "customfeature")] 
extern crate my_optional_dependency;
....

#[cfg(feature = "customfeature")]
use my_optional_dependency::*;
....

Cargo.toml需要有以下部分:

[dependencies.my_optional_dependency]
version = "1.2.3"
optional = true

[features]
customfeature = ["my_optional_dependency"]

这允许您仅在启用某个功能时激活代码的某些部分及其依赖项。

于 2019-09-14T10:20:23.180 回答