我想使用货物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.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)
答案 0 :(得分:18)
您必须在Cargo.toml
中介绍现有功能。
通过执行以下操作,我能够有条件地编译:
在Cargo.toml
中,创建一个features
部分并介绍某个功能名称:
[features]
customfeature = [] # feature has no explicit dependencies
如果您希望自己的功能具有特定的依赖关系,请选中the examples in the documentation。
在您的代码中,使用#[cfg(feature="customfeature")]
运行cargo build --features customfeature
由于您的步骤2& 3似乎没问题,你的Cargo.toml
可能存在问题。
答案 1 :(得分:0)
如其他答案所述,您可以使用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"]
这使您仅在启用功能后才能激活代码的某些部分及其依赖项。