我正在尝试使用cassandra-rs构建一个使用DataStax CPP driver的测试应用。我正在使用cargo 0.6.0 (ec9398e 2015-09-29) (built from git)
。
我的DataStax驱动程序不在Cargo查找的标准目录中。
我添加了一个构建脚本,指定了DataStax驱动程序的路径:
fn main() {
println!("cargo:rustc-link-search={}", "/path/to/dir/");
}
这是我的Cargo.toml:
[package]
name = "castest"
version = "0.1.0"
build = "build.rs"
[dependencies]
cassandra="*"
但cargo build --verbose
表示构建时不包含其他搜索目录。
构建实际失败的包是cql_bindgen,它是cassandra-rs的依赖项。在那个项目中有这个build.rs:
fn main() {
println!("cargo:rustc-flags=-l dylib=crypto");
println!("cargo:rustc-flags=-l dylib=ssl");
println!("cargo:rustc-flags=-l dylib=stdc++");
println!("cargo:rustc-flags=-l dylib=uv");
println!("cargo:rustc-link-search={}", "/usr/lib/");
println!("cargo:rustc-link-search={}", "/usr/local/lib64");
println!("cargo:rustc-link-lib=static=cassandra_static");
}
如何在依赖项目中设置的项目中添加其他库或以其他方式覆盖配置?
答案 0 :(得分:2)
crate的下游用户无法更改该crate的编译方式,除了crate暴露的features之外。
当链接到现有的本机库时,货物build script用于帮助找到要链接的相应库。
这里正确的解决方案是修复上游包(cql_bindgen)build.rs,以允许最终用户指定要在其中搜索的备用路径。一种方法是使用option_env!
宏,例如:
if let Some(datastax_dir) = option_env!("CQL_BINDGEN_DATASTAX_LIB_PATH") {
println!("cargo:rustc-link-search={}", datastax_dir);
}
当然,您可以在迭代时使用本地版本override the dependency获取本地解决方案。
同时,您可以尝试在已搜索的其中一个硬编码目录中安装库。