我试图使用rust的条件编译功能,但它根本不起作用。我尝试使用它在默认库和另一个库之间切换,使用cfg
重新导出两个不同子模块中的一个,具体取决于是否设置了功能标志。代码:
lib.rs:
pub mod ffi;
#[cfg(ffiv1)]
mod ffiv1;
#[cfg(not(ffiv1))]
mod ffiv2;
#[test]
fn test_ffi_struct() {
let _fs = ffi::FFIStruct{ x: 42};
}
#[cfg(ffiv1)]
#[test]
fn test_v1() {
println!("v1 enabled");
}
ffi.rs:
//re-export as ffi::FFIStruct
#[cfg(ffiv1)]
pub use ffiv1::FFIStruct;
#[cfg(not(ffiv1))]
pub use ffiv2::FFIStruct;
ffiv1.rs:
pub struct FFIStruct {
pub x: i32,
y: IShouldFail
}
ffiv2.rs:
pub struct FFIStruct {
pub x: i64
}
Cargo.toml:
[features]
ffiv1 = []
使用默认的cargo build
/ test
,这会构建并按预期工作,一切正常。
使用cargo build --features ffiv1
时,它的行为完全没有传递任何功能标记。使用--verbose运行cargo
会将--cfg 'feature="ffiv1"'
显示为rustc
。
我希望编译在ffiv1.rs中的未定义符号IShouldFail
上失败。 (以及编译时运行的额外测试)。
这里有什么问题?