问题描述
我正在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显然无关紧要。
我曾尝试在链接名称中明确添加“ .dll”,但Rust只是抱怨找不到Rvea0326nc-64.dll.lib。
文档是否错误?我错过了什么吗?有没有一种方法可以使Rust与DLL一起使用?
更新:我发现直接运行Rust编译的可执行文件时,需要DLL而不需要LIB。
解决方法
如果没有在Rust中使用FFI的丰富经验,我可以想象编译您的程序,您将需要在计算机上安装.lib
,以便rustc可以正确检查FFI功能是否正确。然后,当生成的二进制文件运行时,它将在运行时加载.dll
并使用它。
尝试查看在生成安装了.lib
的二进制文件后,是否可以在未安装.lib
的情况下运行该二进制文件。