Rust 链接器寻找 LIB,而不是 DLL

Cha*_*onk 6 windows dllimport rust

我正在 Windows 上尝试 Rust。我的代码声明并调用外部库中的函数。

声明是这样的:

#[link(name = "Rvea0326nc-64")]
extern "C" {
  fn WeibullSpeedProbability(wa: &f32, wk: &f32, qu: &f32, prob: &f32, theerr: &i32) -> ();
}
Run Code Online (Sandbox Code Playgroud)

(都是 ByRef,因为 DLL 是 Fortran。它是用 Intel 编译器构建的。)

请注意,文件名没有扩展名。该 DLL 位于 Rust 项目的 \target\debug\deps 文件夹中。

根据此处的文档 https://doc.rust-lang.org/std/keyword.extern.html,这应该在 Windows 上导入 DLL,但我收到错误,因此:

error: linking with `link.exe` failed: exit code: 1181 
<SNIP>
= note: LINK : fatal error LNK1181: cannot open input file 'Rvea0326nc-64.lib'
Run Code Online (Sandbox Code Playgroud)

果然,如果我找到并复制生成 DLL 的 *.lib 文件,一切都会正常。DLL 显然是无关紧要的。

我尝试在链接名称中明确添加“.dll”,但 Rust 只是抱怨它找不到 Rvea0326nc-64.dll.lib。

文档有误吗?我错过了什么吗?有没有办法让 Rust 与 DLL 一起工作?

更新:我发现直接运行 Rust 编译的可执行文件时,需要 DLL 而不需要 LIB。

Ema*_*oun 3

如果没有太多 Rust 中 FFI 的经验,我可以想象要编译你的程序,你需要.lib在你的机器上安装它,以便 rustc 可以正确检查 FFI 函数是否正确。然后,当运行生成的二进制文件时,它会.dll在运行时加载并使用它。

尝试看看在生成.lib安装的二进制文件后,您是否可以在不安装的情况下运行该二进制文件.lib

  • 谢谢。你的直觉是完全正确的。编译时需要Lib,但运行时需要DLL。C++也是这样,所以我应该解决它。大多数情况下,我使用其他客户端语言,它们可以很好地针对 DLL 本身进行编译(但如果您在导入声明中犯了错误,则在运行时会失败)。 (2认同)