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

问题描述 投票:0回答:2

我正在围绕 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
目录包含在包装器库中,如下所示:

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

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

println!(r"cargo:rustc-link-search=lib\");
rust rust-cargo
2个回答
20
投票

手动。

一个很好的例子是

winapi
板条箱。 它有一对用于导入库的子包,每个子包都有一个构建脚本和一个
lib
目录。 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
投票

以下内容应该适合您:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.