How to Use Build.rs


  1. cargo:rustc-link-lib 用于指定要链接的库。

格式:

// kind(可选):指定库类型,如 static(静态库)、dylib(动态库,默认值)。
// name:库的名称,例如 virt。
println!("cargo:rustc-link-lib={kind}={name}");

eg:

println!("cargo:rustc-link-lib=virt"); // 链接动态库 libvirt
println!("cargo:rustc-link-lib=static=foo"); // 链接静态库 libfoo.a
  1. cargo:rustc-link-search 用于指定 Cargo 搜索库文件的路径。

格式:

// kind(可选):路径类型,如 native(默认值)。
// path:库所在的路径。
println!("cargo:rustc-link-search={kind}={path}");

eg:

println!("cargo:rustc-link-search=/opt/homebrew/lib"); // 在该路径下搜索库
println!("cargo:rustc-link-search=native=/custom/path"); // 指定为 native 类型路径
  1. cargo:rerun-if-changed 告诉 Cargo,当指定的文件改变时,重新运行 build.rs。

格式:

println!("cargo:rerun-if-changed={file}");

eg:

println!("cargo:rerun-if-changed=build.rs"); // 当 build.rs 发生改变时重新运行
println!("cargo:rerun-if-changed=src/lib.rs"); // 监视其他文件
  1. cargo:rerun-if-env-changed 当指定的环境变量改变时,重新运行 build.rs。

eg:

println!("cargo:rerun-if-env-changed=MY_ENV_VAR");
  1. pkg-config 或其他工具输出的指令 如果使用 pkg-config,它会自动输出 cargo:rustc-link-lib 和 cargo:rustc-link-search 的指令。例如:
fn main() {
    pkg_config::Config::new()
        .atleast_version("1.0")
        .probe("libvirt")
        .unwrap();
}

这个调用会检测 libvirt 是否存在,并自动生成指令。

如何确定你需要的指令?

  1. 阅读库文档:查看你需要链接的 C/C++ 库的安装路径、库名称。
  2. 查找库文件:检查系统中安装的库(如 libvirt),通过以下命令找到路径:

macOS/Linux:

pkg-config --libs --cflags libvirt

输出可能包含路径和库名称:

-L/opt/homebrew/lib -lvirt

对应 cargo:rustc-link-search 和 cargo:rustc-link-lib。

double check:

find /usr /opt/homebrew -name "libvirt*"
  1. 调试构建脚本:运行 cargo build,观察报错提示。例如,如果提示 libvirt 未找到,检查是否需要调整库路径或库名称。

总之,需要通过调试和确认依赖信息逐步完善 build.rs 文件。