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