W10 上的 Rust 和 Python:LNK1181

Rust and Python on W10: LNK1181

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

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

cargo build --release 我得到这个错误:

= note: LINK : fatal error LNK1181: cannot open input file 'python39.lib'

这个问题以前出现过, 似乎是最新的相关答案。

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

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

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

还有...

根据第一个link的页面,似乎在build之后,我应该在寻找一个以.so结尾的文件。在 W10 OS 我正在寻找一个 .dll 文件。

如果构建完全成功,在target\debug下我有myrustlib.d、myrustlib.dll、myrustlib.dll.exp、myrustlib.dll.lib、 myrustlib.pdb、pyext_myrustlib.pdb、pyext_myrustlib.d 和 pyext_myrustlib.exe。 None 其中 and/or 重命名为 .dll 扩展名,可以作为 Python 模块成功导入,至少如该页面所述。

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

python39.lib

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

解决方法:

This page, using PyO3 而不是 rust-cpython(实际上是后者的一个分支),似乎在我的机器上成功地做事 + OS 至少。

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

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

而不是

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

如果你想让它编译成功(已通知作者)。我已经成功地创建了一个模块(hashset.cp39-win_amd64.pyd 在 W10 OS 中),它成功地使您能够将这个 Rust 构造导入 Python.