我正在尝试使用 SWIG 和 MinGW-w64 g++ 在 Windows 上将 C++ 与 Python 绑定。到目前为止,我在 C++ 中得到了一个阶乘计算器函数:
// factorial.cpp
long fact(long num)
{
if (num <= 1) return 1;
return num * fact(num - 1);
}
这是我的阶乘。i:
%module factorial
%{
extern long fact(long num);
%}
extern long fact(long num);
然后我使用命令提示符来构建这些:
swig -python -c++ factorial.i
这会生成factorial_wrap.cxx和factorial.py。 然后我使用 MinGW-w64 g++ 来构建这些:
g++ -c factorial.cpp
g++ -c -fpic factorial_wrap.cxx -IC:\Users\kritomas\AppData\Local\Programs\Python\Python38\include
g++ factorial.o factorial_wrap.o -LC:\Users\kritomas\AppData\Local\Programs\Python\Python38\libs -shared -lpython38 -o _factorial.pyd
目前为止没问题。当我在命令提示符中打开 Python 并尝试导入这些内容时,就会出现问题:
C:\Users\kritomas\Desktop>python
Python 3.8.10 (tags/v3.8.10:3d8993a, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import factorial
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\kritomas\Desktop\factorial.py", line 15, in <module>
import _factorial
ImportError: DLL load failed while importing _factorial: The specified module could not be found.
>>>
这是错误,如您在上面看到的。 我已经尝试过 Dependency Walker,它给了我 2 个缺失的 DLL。将它们都放入System32后,仍然出现这种情况。 我已经尝试使用 extern "C" 而不是 extern:
%module factorial
%{
extern "C" long fact(long num);
%}
extern "C" long fact(long num);
它直接删除了fact():
C:\Users\kritomas\Desktop>g++ factorial.o factorial_wrap.o -LC:\Users\kritomas\AppData\Local\Programs\Python\Python38\libs -shared -lpython38 -o _factorial.pyd
factorial_wrap.o:factorial_wrap.cxx:(.text+0x38d7): undefined reference to `fact'
collect2.exe: error: ld returned 1 exit status
我对 Python 3.9.7 也有同样的问题,我降级到 3.8.10 的唯一原因是它在我的 Linux Mint VM(具有 Python 3.8.10)上完美运行,如果不是运行:
g++ -c -fpic factorial_wrap.cxx -IC:\Users\kritomas\AppData\Local\Programs\Python\Python38\include
g++ factorial.o factorial_wrap.o -LC:\Users\kritomas\AppData\Local\Programs\Python\Python38\libs -shared -lpython38 -o _factorial.pyd
我跑步:
g++ -c -fpic factorial_wrap.cxx -I/usr/include/python3.8
g++ factorial.o factorial_wrap.o -shared -o _factorial.so
效果完美:
kritomas@kritomas-virtual-machine:~/Desktop$ python
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import factorial
>>> factorial.fact(5)
120
我做错了什么?我在这里缺少什么吗?请帮我。预先感谢;)
在 Windows 上将 python 升级到 3.9 后,我遇到了完全相同的问题。经过几个小时的努力,我设法通过手动将一些 dll 从 mingw32-g++ 所在的
***/mingw/bin/
复制到我的 ***.pyd
所在的位置来解决这个问题。我确信 ***/mingw/bin/
已被附加到 %PATH% 中,但不知道为什么 python3.9 找不到它。
我解决了这个问题,迁移到 clang/clang++
安装llvm:
choco install --yes llvm
然后尝试:
clang++ -c factorial.cpp
clang++ -c factorial_wrap.cxx -IC:\Users\kritomas\AppData\Local\Programs\Python\Python38\include
clang++ factorial.o factorial_wrap.o -LC:\Users\kritomas\AppData\Local\Programs\Python\Python38\libs -shared -lpython38 -o _factorial.pyd