在Windows中编译用于python的SWIG包装器

首先,感谢你们在过去几年在这个论坛上给我的所有答案,但今天我找不到明确的答案,所以我虽然是时候发布。

我设法在我的Debian distrib上编译并运行一个C ++代码test5.cpp ,用SWIG将它包装起来(也许这不是正确的词)到一个Python模块Amod.py (这需要一个“翻译”文件test5.i 。并成功导入数据分析模块到其他更复杂的Python代码(基本上操纵numpy数组,matplotlib等..)。

现在我想在Windows计算机上运行相同的代码,但是然后python不能再导入模块了,图书馆文件_Amod.so是一个.so文件,而不是.pyd。 但是我找不到在Windows上重新编译它的快捷方法。 我挖的CodeBlocks文档,但它的lacunary,我迷路了。 ( http://wiki.codeblocks.org/index.php?title=Adding_support_for_non_C/C%2B%2B_files_to_the_build_system )

基本上我想运行下面的工作代码的Windows相当于(我希望可以帮助初学者是SWIG):

汇编:

 swig -c++ -python test5.i g++ -fPIC -c test5.cpp g++ -fPIC -c test5_wrap.cxx -I/usr/include/python2.7 g++ -shared test5.o test5_wrap.o -o _Amod.so 

我应该使用什么样的软件和编译器,以及如何,而不会浪费我的时间? (我已经得到了CodeBlocks)非常感谢。

有关信息,如果需要, test5.i是以下内容,包装在numpy数组中的C + +数组,添加一些内联(replacefunction)检查的目的(所有被挖掘到血液和眼泪swig帮助):

 /* %module module_name is used in compilation as: g++ -shared main.o main_wrap.o -o _module_name.so (with the underscore)*/ %module Amod %{ /* Put header files here or function declarations like below. The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a python extension, inserting the module init code. check http://www.swig.org/Doc1.3/Python.html#Python_nn3 */ #define SWIG_FILE_WITH_INIT #include "test5.h" %} /* numpy.i and import_array() allow SWIG to manipulate C++ pointer (like double* ivec) like numpy array, because SWIG doesn't know a priori, that the pointer refer to an array. check http://docs.scipy.org/doc/numpy/reference/swig.interface-file.html */ %include "numpy.i" %init %{ import_array(); %} /* C++ function arg must fits the typemap directives available in numpy.i. */ %apply (int DIM1, double* INPLACE_ARRAY1) {(int len1, double* ivec),(int len2, double* ovec),(int len3, double* gauss)}; %rename (abel) abel_swig; %exception abel_swig { $action if (PyErr_Occurred()) SWIG_fail; } %inline %{ void abel_swig(int len1, double* ivec, int len2, double* ovec, int algo, double alpha) { if (len1 != len2) { PyErr_Format(PyExc_ValueError,"Arrays of lengths (%d,%d) given",len1, len2); return; } memset(ovec, 0, len1*sizeof(double)); return abel(len1, ivec, len2, ovec, algo, alpha); } %} %rename (convol_gauss) convol_gauss_swig; %exception convol_gauss_swig { $action if (PyErr_Occurred()) SWIG_fail; } %inline %{ void convol_gauss_swig(int len1, double* ivec, int len2, double* ovec, int len3, double* gauss) { if ((len1 != len2)||(len1 != len3)) { PyErr_Format(PyExc_ValueError,"Arrays of lengths (%d,%d,%d) given, they must be the same",len1, len2, len3); return; } memset(ovec, 0, len1*sizeof(double)); return convol_gauss(len1, ivec, len2, ovec, len3, gauss); } %} /* Put header files here or function declarations like below */ %include "test5.h" 

和头文件test5.h

 #ifndef TEST5_H_INCLUDED #define TEST5_H_INCLUDED #include <cstring> #include <iostream> #include <cmath> void convol_gauss(int size, double* ivec, int size2, double* ovec, int size3, double* gauss); void abel(int len1, double* ivec, int len2, double* ovec, int algo); #endif // TEST5_H_INCLUDED 

Solutions Collecting From Web of "在Windows中编译用于python的SWIG包装器"

好吧,我设法做到了。

1-注意你的.i文件是用utf-8编码的,因为如果Python是不同的编码方式,就不能让swig编译。(# #error Must use Python with unicode enabled

2-在www.swig.org上下载swig for Windows并安装MinGW

在cmd或Powershell中键入3

 swig -c++ -python test5.i g++ -c -Wall test5.cpp g++ -c -Wall test5_wrap.cxx -IC:\Python27\include -IC:\Python27\Lib\site-packages\numpy\core\include\ g++ -Wall -shared -IC:\Python27\include -IC:\Python27\Lib\site-packages\numpy\core\include\ test5.o test5_wrap.o -o _Amod.pyd -LC:/Python27/libs/ -lpython27 

-IC:\Python27\Lib\site-packages\numpy\core\include\解决错误: fatal error : numpy\arrayobject.h no such file or directory

-LC:/Python27/libs/ -lpython27解决错误: undefined reference to _imp__Py...

与Linux编译相反,库C:/Python27/libs/python27.lib必须小心链接,以及头文件的直接链接(C:\ Python27 \ include和Numpy C:\ Python27 \ Lib \ site包\ numpy \核心\包括)希望它可以帮助,但我没有感觉这是一个非常干净的工作。 考虑到我遇到的错误,请参阅此前的文章 。