无法添加到依赖项的rustc-link-search路径

时间:2015-09-30 08:51:12

标签: rust rust-cargo

我正在尝试使用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");
}

如何在依赖项目中设置的项目中添加其他库或以其他方式覆盖配置?

1 个答案:

答案 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获取本地解决方案。

同时,您可以尝试在已搜索的其中一个硬编码目录中安装库。