我想使用
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)
您必须介绍您的
Cargo.toml
中现有的功能。
我能够通过执行以下操作进行条件编译:
在
Cargo.toml
中,创建一个features
部分并引入某个功能名称:
[features]
customfeature = [] # feature has no explicit dependencies
如果您希望您的功能具有特定的依赖关系,请检查文档中的示例。
在您的代码中,使用
#[cfg(feature="customfeature")]
运行
cargo build --features customfeature
既然您的步骤 2 和 3 看起来没问题,那么您的
Cargo.toml
可能有问题。
如其他答案中所述,您可以使用
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"]
这允许您仅在启用功能时激活代码的某些部分及其依赖项。
或者,您可以在项目主文件夹中创建 .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
如果您本身不需要
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 了解更多信息。