绑定 C++ 和 Python 时,SWIG 在 Windows 和 MinGW-w64 上不起作用:导入时 DLL 加载失败:找不到指定的模块

SWIG doesn't work on Windows with MinGW-w64 when binding C++ and Python: DLL load failed while importing: The specified module could not be found

我正在尝试使用 SWIG 和 MinGW-w64 g++ 在 Windows 上将 C++ 与 Python 绑定。到目前为止,我在 C++ 中得到了一个阶乘计算器函数:

// factorial.cpp
long fact(long num)
{
    if (num <= 1) return 1;
    return num * fact(num - 1);
}

这是我的 factorial.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),如果不是 运行ning:

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 找不到它。