如何使用`cfg`和Cargo进行条件编译?

57

我想使用Cargo的cfg进行条件编译我的源代码, 在谷歌上搜索了一段时间后, 似乎解决方法是使用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识别这些特性呢?我需要在Cargo.toml文件中添加什么吗?

这是我正在使用的rustccargo版本:

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)
3个回答

59
你需要在 Cargo.toml 中介绍现有的功能。
我通过以下方式能够进行有条件编译:
  • In Cargo.toml, create a features section and introduce a certain feature name:

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

    If you want your feature to have specific dependencies check the examples in the documentation.

  • In your code, use #[cfg(feature="customfeature")]

  • Run cargo build --features customfeature

由于您的第二步和第三步似乎都没问题,所以问题可能出在您的 Cargo.toml 文件上。


在“if”语句中测试特性是否可能?谢谢。 - anon
12
@BulatM.,是的,你可以使用 if cfg!(feature = "customfeature") { ... } - Pauan

12

正如其他答案中所述,您可以使用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"]

如果启用了某个功能,这将允许您仅激活代码中特定部分及其依赖项。


1
谢谢Alex!在阅读了你的回答之后,我终于完全理解了Rust的特性。 - Just a learner

10

或者,您可以在项目中创建一个cargo配置文件,方法是在项目主文件夹中创建一个.cargo子目录,在其中添加一个config.toml文件, 然后将此部分插入 .cargo/config.toml 中:

[build]
rustflags = "--cfg my_cfg_flag"

这将会让cargo使用标记--cfg my_cfg_flag调用rustc

详见: https://doc.rust-lang.org/cargo/reference/config.html


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