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

How do I make rustc-link-search relative to the project location?

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

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\");

手动。

一个很好的例子是 winapi crate. It has a pair of sub-crates for import libraries, each of which has a build script and a lib directory. The 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());
}

以下应该适合您:

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

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