W10 上的 Rust 和 Python:LNK1181

问题描述

我正在尝试编写一个可以从 Python 调用的 Rust 模块。我正在关注此页面

https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust#edit_src_lib_rs

cargo build --release 我收到此错误

= 注意:链接:致命错误 LNK1181:无法打开输入文件 'python39.lib'

这之前出现过,this 似乎是最新且相关的答案。

我似乎已经尝试了该答案中所有可能的解决方案,包括定位和运行 vcvars64.bat,详见 here。没有快乐。

我安装了 MS Visual Studio (2019),以及 C++ 和 W10 SDK 组件。

重要的是,当我不包括 --release 开关。没有它,程序(有时)编译并运行正常。鉴于想要制作 Rust 模块的一个原因是性能,但是,我想解决这个问题。此外,我现在还发现,“调试”版本的这种成功构建是 a) 间歇性和 b) 部分性的:当它失败时,会创建一些所需的输出文件,但不会创建其他文件

还有……

根据第一个链接页面,在 build 之后,我应该寻找以 .so 结尾的文件。在 W10 操作系统中,我正在寻找 .dll 文件

如果它完全成功构建,在 target\debug 下我有 myrustlib.d、myrustlib.dll、myrustlib.dll.exp、myrustlib.dll.lib、myrustlib.pdb、pyext_myrustlib.pdb、pyext_myrustlib.d 和 pyext_myrustlib.exe .这些,重命名和/或赋予 .dll 扩展名(如适用)都不能作为 Python 模块成功导入,至少如该页面上所述。

我也发现 this more recent page 可以做同样的事情。我收到同样的 1181 错误

python39.lib

我找到了它在我系统中的位置,在 ... Python\python39\libs 下。我修改了我的 PATH env var 以专门包含此路径(并重新启动)。还是一样的错误

解决方法

解决方法:

This page,使用 PyO3 而不是 rust-cpython(实际上是后者的一个分支),至少在我的机器 + 操作系统上似乎可以成功完成。

注意在编写第二个示例时似乎包含一个错字:我认为应该是

fn hashset(_: Python,m: &PyModule) -> PyResult<()> {

而不是

fn hash_set(_: Python,m: &PyModule) -> PyResult<()> {

如果你想让它编译好(作者已被通知)。我设法创建了一个模块(W10 操作系统中的 hashset.cp39-win_amd64.pyd),它成功地使您能够将此 Rust 构造导入 Python。