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

问题描述 投票:0回答:2

我正在尝试使用 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

我做错了什么?我在这里缺少什么吗?请帮我。预先感谢;)

python c++ windows swig mingw-w64
2个回答
3
投票

在 Windows 上将 python 升级到 3.9 后,我遇到了完全相同的问题。经过几个小时的努力,我设法通过手动将一些 dll 从 mingw32-g++ 所在的

***/mingw/bin/
复制到我的
***.pyd
所在的位置来解决这个问题。我确信
***/mingw/bin/
已被附加到 %PATH% 中,但不知道为什么 python3.9 找不到它。


0
投票

我解决了这个问题,迁移到 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
© www.soinside.com 2019 - 2024. All rights reserved.