2010-10-05 23 views
1

我想用swig为python构建一个C++扩展。我按照下面的说明和其他人的T,似乎无法让我的扩展加载。所有可用的swig + python + mingw编译信息过时了吗?

我在MinGW网站的“我如何创建Python扩展?”下跑过这篇文章。

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

我还发现,这些教程:

http://boodebr.org/main/python/build-windows-extensions http://www.mail-archive.com/[email protected]/msg04655.html http://oldwiki.mingw.org/index.php/Python%20extensions

我使用Panda3d-1.7.0构建反对 - 熊猫在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并运行命令行>蟒蛇-c“导入扩展”,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

回答

2

两件事情来验证:

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

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

这两个加起来的意见,确保在ABI我们假定你是在你的扩展DLL匹配的ABI由托管应用程序假定,那你是不是复制的基本功能模块,如CRT可能包含或管理难以在实例之间正确共享的状态。

编辑:该问题的改进编辑强烈反映微软的C++ ABI与GCC C++ ABI之间的不匹配问题是known to differ

+0

感谢您的协助。依赖walker指出一些lib *。我链接的文件在我的路径中缺少它们各自的dll,我将稍后使用它,当解决问题时我会与您取得联系。 – 2010-10-05 01:21:57

+0

刚刚检查了一切,它看起来像是我的问题 - gcc/g ++链接到一个lib * .a,它没有它的伴侣dll在我的%PATH% - 再次感谢建议和href的依赖沃克,拯救了我的一天! – 2010-10-05 01:26:10

+0

@ct,还要注意,可以编写依赖项步行者脚本。例如,在构建发行版或安装程序之前,我已将其作为我的常规测试套件的一部分,以确保我已打包了所有需要的DLL。这是一个方便的工具。很高兴有帮助。 – RBerteig 2010-10-05 07:19:04