如何相对于项目位置进行rustc-link-search?

时间:2017-01-29 02:35:10

标签: rust rust-cargo

我正在围绕C库创建一个Rust包装器。我已将C库放在lib目录中,并且我使用build.rs告诉编译器在哪里可以找到要链接的库:

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");

当我构建库时这很好用,但依赖于包装器库的下游库会出现编译失败:

error: could not find native static library `wrapped-lib`, perhaps an -L flag is missing?

问题似乎在于:

println!(r"cargo:rustc-link-search=lib\");

编译客户端库时,这不会指向repository\checked_out_project\lib,而是看起来在本地,因为在依赖项中指定绝对路径有效:

println!(r"cargo:rustc-link-search=C:\users\id\.cargo\..\lib\");

我还指示Cargo将lib目录包含在wrapper-lib中,如下所示:

include = ["lib/**/*"]

如何告诉编译器相对于依赖项,而不是正在构建的项目?我认为这应该有效:

println!(r"cargo:rustc-link-search=lib\");

2 个答案:

答案 0 :(得分:4)

手动

一个很好的例子是winapi箱子。它有一对用于导入库的子包,每个子包都有一个构建脚本和一个lib目录。 build script for the i686 crate包含以下内容:

use std::path::Path;
use std::env;

fn main() {
    let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
    println!("cargo:rustc-link-search=native={}", Path::new(&dir).join("lib").display());
}

答案 1 :(得分:0)

以下应该对您有用:

println!("cargo:rustc-link-search=native=./lib");

它将是相对路径,没有任何环境变量。