我有一个Rust库,它基本上是一些C源代码,并且是一个bindgen包装器。它有一个build.rs
脚本进入C源目录,运行make
,并将.a
静态库复制到$OUT_DIR
。当我运行cargo build
时,一切正常。
但是,当我将该库作为依赖项添加到另一个项目foo-rs
中时,似乎make
永远不会运行。我最终得到的错误是
Compiling foo-sys v0.1.6
Running `rustc <LOTS OF STUFF> -L /home/paul/projects/foo-rs/target/build/foo-sys-936b7a25940b4bf0/out -l foo:static`
error: could not find native static library `foo`, perhaps an -L flag is missing?
Could not compile `foo-sys`.
以下是build.rs
包中的foo-sys
:
use std::old_io::{fs, Command};
use std::os;
use std::old_io::process::InheritFd;
fn main() {
let manifest_dir = Path::new(os::getenv("PWD").unwrap());
let out_dir = Path::new(os::getenv("OUT_DIR").unwrap());
let src_dir = manifest_dir.join("src");
let foo_dir = src_dir.join("foo");
let foo_lib = foo_dir.join("libfoo.a");
let mut make = Command::new("make");
assert!(make.cwd(&foo_dir)
.arg("release")
.stdout(InheritFd(1))
.stderr(InheritFd(2))
.status()
.unwrap()
.success());
if let Err(_) = fs::copy(&foo_lib, &out_dir.join("libfoo.a")) {
println!("ERROR COPYING libfoo.a");
}
println!("cargo:rustc-flags=-L {} -l foo:static", out_dir.display());
}
让我感到困惑的是,如果您查看上面的rustc
行,它会在-L
的末尾有-l foo:static
和build.rs
行,但{{{ 1}}无处可寻。
所以不知何故,libfoo.a
命令没有运行,但make
脚本仍在运行?
答案 0 :(得分:-1)
不要使用PWD
,请尝试CARGO_MANIFEST_DIR
。文档说:
CARGO_MANIFEST_DIR
- 包含正在构建的包的清单的目录(包含构建脚本的包)。另请注意,这是构建脚本启动时当前工作目录的值。
我认为这里有一个很好的区别 - 程序可能在正确的目录中运行,但PWD
变量未更新以匹配它。这可能是一个货物错误,如果它是真的。
但是,没有理由复制libfoo.a。相反,请将foo_dir
与-L而不是out_dir
一起使用,只需链接到库所在的位置即可。