【问题标题】:is all the available swig+python+mingw compile information outdated?所有可用的 swig+python+mingw 编译信息都过时了吗?
【发布时间】:2010-10-05 00:28:05
【问题描述】:

我正在尝试使用 swig 为 python 构建一个 C++ 扩展。我已按照以下说明和其他说明操作到 T 并且似乎无法加载我的扩展程序。

我在 MinGW 网站上的“如何创建 Python 扩展?”下看到了这篇文章

http://www.mingw.org/wiki/FAQ

我还找到了这些教程:

http://boodebr.org/main/python/build-windows-extensions http://www.mail-archive.com/modwsgi@googlegroups.com/msg04655.html http://oldwiki.mingw.org/index.php/Python%20extensions

我正在使用 Panda3d-1.7.0 进行构建 - win32 上的 panda 正在运行 python2.6.4(已编译 MSC v.1500)。我正在使用 MinGW gcc/g++ (GCC) 3.4.5 进行编译。

我注意到,当我使用以下命令运行 setup.py 时:

python setup.py build -cmingw32

gcc.exe 首先运行,然后是 g++.exe 来构建 pyd。 g++ 正在链接:-lpython26 -lmsvcr90

她的构建和链接足够好(没有错误)但是,当我将 _extension.pyd 和 extension.py 文件复制到 Panda3d-1.7.0\python\Lib\site-packages 并运行 > python -c "import扩展名”,Python 会转储以下内容:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 25, in <module>
    _bullet = swig_import_helper()
  File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 21, in swig_import_helper
    _mod = imp.load_module('_extension', fp, pathname, description)
ImportError: DLL load failed: The specified module could not be found.

任何提示或指示?谢谢!

ct

【问题讨论】:

    标签: c++ python swig


    【解决方案1】:

    需要验证的两件事:

    • 使用dependency walker 检查绑定到您的 python 和扩展 DLL 的 C 运行时库 DLL,以确保它们使用相同的 CRT。在为其他语言构建扩展时,这是一个常见的麻烦来源。 (例如,我经常在 Lua 中看到它)并且可能会导致特别难以追踪的有趣且间歇性的错误。

    • IIRC,Windows 的“官方”Python 版本已从 MinGW 切换到 Visual Studio Express。由于 C++ ABI 中不可调和的差异,这可能使得几乎不可能使用 MinGW 构建可以从编译并与 Visual Studio 链接的 Python 调用的 C++ 扩展。

    这两个加起来就是建议,以确保您在扩展 DLL 中假设的 ABI 与托管应用程序假设的 ABI 相匹配,并且您没有复制基本功能块,例如 CRT 可能包含或管理难以在实例之间正确共享的状态。

    编辑:对问题的改进编辑强烈说明了 Microsoft 的 C++ ABI 和 GCC C++ ABI(known to differ)之间存在不匹配的问题。

    【讨论】:

    • 感谢您的帮助。依赖项步行者指出我链接的一些 lib*.a 文件在我的路径中缺少它们各自的 dll 我将使用它一段时间,当它解决时我会回复你.
    • 刚刚检查了所有内容,看起来这是我的问题 - gcc/g++ 正在链接一个 lib*.a,而我的 %PATH% 中没有它的配套 dll - 再次感谢对依赖walker的建议和href,拯救了我的一天!
    • @ct,还要注意依赖walker可以编写脚本。例如,在构建版本或安装程序之前,我已将它作为我的常规测试套件的一部分包含在内,以确保我已经打包了所有需要的 DLL。它是一种方便的工具。很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多