如何将条件编译与 `cfg` 和 Cargo 一起使用?

问题描述 投票:0回答:4

我想使用

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)
rust rust-cargo
4个回答
65
投票

您必须介绍您的

Cargo.toml
中现有的功能。

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

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

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

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

  • 在您的代码中,使用

    #[cfg(feature="customfeature")]

  • 运行

    cargo build --features customfeature

既然您的步骤 2 和 3 看起来没问题,那么您的

Cargo.toml
可能有问题。


13
投票

如其他答案中所述,您可以使用

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"]

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


13
投票

或者,您可以在项目主文件夹中创建 .cargo 子目录,并在其中添加

config.toml
文件,从而在项目中创建
cargo 配置文件
, 然后将此部分插入
.cargo/config.toml
:

[build]
rustflags = "--cfg my_cfg_flag"

这将使 cargo 使用标志 --cfg my_cfg_flag 调用 rustc

详情请看这里: https://doc.rust-lang.org/cargo/reference/config.html


0
投票

如果您本身不需要

features
,也可以使用构建脚本:

在 build.rs 中:

fn main() {
  println!("cargo::rustc-cfg=foo");
}

在你的源代码中:

fn main() {
  #[cfg(foo)]
  println!("Hello, foo!");
  #[cfg(bar)]
  println!("Hello, bar!");
}

我个人喜欢这个,因为您只需要在一个位置更改它(您也可以使用构建脚本中的环境变量)

参见 https://doc.rust-lang.org/cargo/reference/build-scripts.html#rustc-cfg 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.