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

Ale*_*lar 1 rust rust-cargo

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

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

当我构建库时,此方法工作正常,但是依赖包装器库的下游库会出现编译失败:

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

问题似乎在于:

println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

编译客户端库时,这并不指向repository\checked_out_project\lib而是在本地查找,因为在依赖项中指定绝对路径是可行的:

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

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

include = ["lib/**/*"]
Run Code Online (Sandbox Code Playgroud)

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

println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 5

手动。

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

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());
}
Run Code Online (Sandbox Code Playgroud)