我正在围绕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\");
答案 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");
它将是相对路径,没有任何环境变量。