Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SWIG、mingw32、distutils的问题_Python_C++_Swig_Distutils_Mingw32 - Fatal编程技术网

Python SWIG、mingw32、distutils的问题

Python SWIG、mingw32、distutils的问题,python,c++,swig,distutils,mingw32,Python,C++,Swig,Distutils,Mingw32,我一直在尝试在Windows 7下设置Python 2.7环境,这样我就可以编译一个C++扩展,用于Python。因为我是新手,所以我下载了一个简单的示例,并逐字使用了这些文件。路径中还有一个numpy.I文件。我已经用mingw(最新版本)和swig(3.0.10版)设置了我的计算机,我的Python版本是2.7.9。我甚至用这个环境编译了一个用C++的小C++程序,没有问题。 但是,当尝试构建上面提到的“简单”Python扩展时,我总是得到以下输出,表示失败(我在Windows cmd.ex

我一直在尝试在Windows 7下设置Python 2.7环境,这样我就可以编译一个C++扩展,用于Python。因为我是新手,所以我下载了一个简单的示例,并逐字使用了这些文件。路径中还有一个numpy.I文件。我已经用mingw(最新版本)和swig(3.0.10版)设置了我的计算机,我的Python版本是2.7.9。我甚至用这个环境编译了一个用C++的小C++程序,没有问题。 但是,当尝试构建上面提到的“简单”Python扩展时,我总是得到以下输出,表示失败(我在Windows cmd.exe窗口中发出的命令包含在下面的第一行):

我有一种可怕的感觉,我在这里遗漏了一些非常简单的东西,但我已经成功地在一个单独的Cygwin环境中编译了这些相同的文件,没有任何问题(是的,我希望能够在一个非Cygwin环境中这样做)

我不想用太多的代码来扼杀这个问题,但是,作为参考,这里是我正在使用的文件
simple.I
setup.py

simple.i:
%module simple
%{
  #define SWIG_FILE_WITH_INIT
  #include "simple.h"
%}

%include "numpy.i"
%init %{
import_array();
%}

%apply (int DIM1, double* INPLACE_ARRAY1) {(int n0, double *a0)};
%apply (int DIM1, double* IN_ARRAY1) {(int n, double *a), (int m, double *b)};
%apply (int DIM1, double* ARGOUT_ARRAY1) {(int size, double *arr)};
%include "simple.h"

setup.py:
from distutils.core import setup, Extension
import numpy
import os

os.environ['CC'] = 'g++';
setup(name='matt_simple_test', version='1.0', ext_modules =[Extension('_simple',['simple.cc', 'simple.i'], include_dirs = [numpy.get_include(),'.'])])
如果需要其他代码,我很乐意发布它们,但同样,其他文件(
simple.cc
simple.h
)是从中逐字使用的


P> >问题是:有人能指导我改正这个错误吗?< /P> < P>在编译步骤中,输入文件被编译为C++代码,符号中的函数将被赋予与C(名字Mangle)不兼容的符号。 C:\MinGW\bin\gcc.exe-mdll-O-Wall -IC:\Python27\lib\site packages\numpy\core\include-I.-IC:\Python27\include-IC:\Python27\PC-c simple.cc-o build\temp.win32-2.7\Release\simple.o


在此编译步骤中,输入文件被编译为C代码,symbols.cc中函数的符号应不同

C:\MinGW\bin\gcc.exe-mdll-O-Wall -IC:\Python27\lib\sitepackages\numpy\core\include-I.-IC:\Python27\include-IC:\Python27\PC-c simple\u wrap.c-o build\temp.win32-2.7\Release\simple\u wrap.o

解决此问题的一种方法是添加
swig\u opts

setup(name='matt_simple_test', version='1.0', 
      ext_modules=[Extension('_simple', ['simple.cc', 'simple.i'],
                   swig_opts=["-c++"],
                   include_dirs = [numpy.get_include(),'.'])])
另一个选项是在simple.cc中使用
extern“C”

extern "C" double dot(int n, double *a, int m, double *b)
...
extern "C" void create_list(int size, double *arr)
...

你检查过MingW和python都是32位的吗?我使用了标准的MingW安装程序,我的理解是它应该是32位的。通过谷歌搜索可以看出,mingw-64是从mingw32派生出来的,我当然没有安装这个派生。Python绝对是32位的。是的,将
swig_opts
添加到setup命令中就成功了!非常感谢!
extern "C" double dot(int n, double *a, int m, double *b)
...
extern "C" void create_list(int size, double *arr)
...