我正在围绕 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\");
手动。
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());
}
以下内容应该适合您:
println!("cargo:rustc-link-search=native=./lib");
它必须是相对路径,没有任何环境变量。