Rust 链接器寻找 LIB,而不是 DLL
Rust linker seeks a LIB, rather than a DLL
我正在 Windows 上试验 Rust。我的代码声明并调用了外部库中的函数。
声明是这样的:
#[link(name = "Rvea0326nc-64")]
extern "C" {
fn WeibullSpeedProbability(wa: &f32, wk: &f32, qu: &f32, prob: &f32, theerr: &i32) -> ();
}
(都是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'
果然,如果我找到并复制生成 DLL 的 *.lib 文件,一切正常。 DLL 显然无关紧要。
我已经尝试在 link 名称中显式添加“.dll”,但 Rust 只是抱怨找不到 Rvea0326nc-64.dll.lib.
文档有错吗?我错过了什么吗?有没有办法让 Rust 与 DLL 一起工作?
更新:我发现直接运行Rust编译的可执行文件时,需要DLL,不需要LIB。
在没有太多 Rust 中 FFI 经验的情况下,我可以想象编译你的程序,你需要在你的机器上安装 .lib
,这样 rustc 才能正确检查 FFI 函数是否正确。然后当生成的二进制文件为 运行 时,它会在 运行 时加载 .dll
并使用它。
尝试查看在生成安装了 .lib
的二进制文件后,您是否可以 运行 未安装 .lib
的二进制文件。
我正在 Windows 上试验 Rust。我的代码声明并调用了外部库中的函数。
声明是这样的:
#[link(name = "Rvea0326nc-64")]
extern "C" {
fn WeibullSpeedProbability(wa: &f32, wk: &f32, qu: &f32, prob: &f32, theerr: &i32) -> ();
}
(都是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'
果然,如果我找到并复制生成 DLL 的 *.lib 文件,一切正常。 DLL 显然无关紧要。
我已经尝试在 link 名称中显式添加“.dll”,但 Rust 只是抱怨找不到 Rvea0326nc-64.dll.lib.
文档有错吗?我错过了什么吗?有没有办法让 Rust 与 DLL 一起工作?
更新:我发现直接运行Rust编译的可执行文件时,需要DLL,不需要LIB。
在没有太多 Rust 中 FFI 经验的情况下,我可以想象编译你的程序,你需要在你的机器上安装 .lib
,这样 rustc 才能正确检查 FFI 函数是否正确。然后当生成的二进制文件为 运行 时,它会在 运行 时加载 .dll
并使用它。
尝试查看在生成安装了 .lib
的二进制文件后,您是否可以 运行 未安装 .lib
的二进制文件。