Rust链接器寻求LIB,而不是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显然无关紧要。

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

文档是否错误?我错过了什么吗?有没有一种方法可以使Rust与DLL一起使用?

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

解决方法

如果没有在Rust中使用FFI的丰富经验,我可以想象编译您的程序,您将需要在计算机上安装.lib,以便rustc可以正确检查FFI功能是否正确。然后,当生成的二进制文件运行时,它将在运行时加载.dll并使用它。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...