据我所知,有两种方法可以在Rust包中链接本地库。
你也可以直接把链接器标志传递给rustc ,但这对包来说有点太低级了。
属性的方法是最简单的,但它也是相当不灵活的。一旦属性在上游的FFI库中被设置,下游的依赖者就无法控制它了。这对大多数库来说通常是可以的,因为名称是固定的,而且是提前知道的。
然而,在名称不能提前知道的情况下(例如,平台依赖库),或者你想为最终的应用程序提供库的选择,构建脚本提供了更大的灵活性。
人们可能会想在上游FFI库中省略#[link(…)] 属性,让下游应用程序设置该属性,但这并不像人们所期望的那样工作。这是由于rust-lang/rust#28605的缘故,它导致链接器标志被这样排序。
cc downstreamapp -l somenativelib upstreamrustlib
因为本地库出现在上游库之前,所以本地库中的符号对于上游库是不可用的。
幸运的是,在构建脚本中,自定义链接标志总是被放在最后。为了方便起见,人们通常会把它放在一个单独的板条箱中,其中只包含这样的构建脚本。
fn main() {
println!("cargo:rustc-link-lib=dylib=somenativelib");
}