现有的swig+python+mingw编译信息都过时了吗?
我正在尝试使用swig为Python构建一个C++扩展。我严格按照下面的说明和其他资料操作,但似乎无法加载我的扩展。
我在MinGW网站上看到了一篇关于“如何创建Python扩展?”的文章。
我还找到了一些教程:
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进行构建,Panda在win32上运行的是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 extension"时,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
1 个回答
有两件事情需要确认:
检查一下你的 Python 和扩展 DLL 绑定的 C 运行时库(CRT)DLL,使用 dependency walker 工具,确保它们使用的是同一个 CRT。这是构建其他语言扩展时常见的问题来源。例如,我在 Lua 中经常看到这种情况,这可能会导致一些奇怪且间歇性的错误,特别难以追踪。
如果我没记错的话,Windows 上的“官方” Python 版本已经从 MinGW 切换到了 Visual Studio Express。这可能会让你几乎无法使用 MinGW 来构建可以从用 Visual Studio 编译和链接的 Python 调用的 C++ 扩展,因为 C++ 的应用二进制接口(ABI)之间存在不可调和的差异。
这两点的意思是,你需要确保你在扩展 DLL 中假设的 ABI 和主应用程序假设的 ABI 是一致的,并且你没有重复一些基本的功能模块,比如 CRT,这些模块可能包含或管理一些状态,这些状态在不同实例之间共享时很难正确处理。
编辑:问题的改进版本强烈表明,微软的 C++ ABI 和 GCC 的 C++ ABI 之间存在不匹配的问题,这些差异是 众所周知的。