SWIG、mingw32、distutils 的问题
Problems with SWIG, mingw32, distutils
我一直在尝试在 Windows 7 下设置一个 Python 2.7 环境,以便我可以编译一个 C++ 扩展以供在 Python 中使用。由于我是新手,我下载了一个简单的示例 here 并逐字使用了这些文件。我在路径中还有一个 numpy.i 文件。我已经用 mingw(最新版本)和 swig(v.3.0.10)设置了我的电脑,我的 Python 版本是 2.7.9。我什至用这个环境用 g++ 编译了一个小的 C++ 程序,没有问题。
但是当尝试构建上面引用的 "simple" Python 扩展时,我总是得到以下输出,表明失败(我已经包含了我在 Windows 中发出的命令cmd.exe window 如下面第一行):
python setup.py build -c=mingw32
running build
running build_ext
building '_simple' extension
swigging simple.i to simple_wrap.c
C:\swigwin\swigwin-3.0.10\swig.exe -python -o simple_wrap.c simple.i
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:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\sitepackages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o
writing build\temp.win32-2.7\Release\_simple.def
C:\MinGW\bin\g++.exe -shared -s build\temp.win32-2.7\Release\simple.o build\temp.win32-2.7\Release\simple_wrap.o build\temp.win32-2.7\Release\_simple.def -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o build\lib.win32-2.7\_simple.pyd
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0xce5): undefined reference to `create_list'
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0x170d): undefined reference to `dot'
collect2.exe: error: ld returned 1 exit status
error: command 'C:\MinGW\bin\g++.exe' failed with exit status 1
我有一种糟糕的感觉,我在这里遗漏了一些非常简单的东西,但我已经成功地在一个单独的 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(),'.'])])
如果需要其他代码,我很乐意 post 它们,但是同样,其他文件(simple.cc
和 simple.h
)是从 here 中逐字使用的.
所以,问题是:谁能指导我更正这个错误?
在此编译步骤中,输入文件被编译为 C++ 代码,symbol.cc 中的函数将被赋予与 C 不兼容的符号(名称改编)。
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_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o
解决该问题的一种方法是添加 swig_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)
...
我一直在尝试在 Windows 7 下设置一个 Python 2.7 环境,以便我可以编译一个 C++ 扩展以供在 Python 中使用。由于我是新手,我下载了一个简单的示例 here 并逐字使用了这些文件。我在路径中还有一个 numpy.i 文件。我已经用 mingw(最新版本)和 swig(v.3.0.10)设置了我的电脑,我的 Python 版本是 2.7.9。我什至用这个环境用 g++ 编译了一个小的 C++ 程序,没有问题。
但是当尝试构建上面引用的 "simple" Python 扩展时,我总是得到以下输出,表明失败(我已经包含了我在 Windows 中发出的命令cmd.exe window 如下面第一行):
python setup.py build -c=mingw32
running build
running build_ext
building '_simple' extension
swigging simple.i to simple_wrap.c
C:\swigwin\swigwin-3.0.10\swig.exe -python -o simple_wrap.c simple.i
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:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\sitepackages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o
writing build\temp.win32-2.7\Release\_simple.def
C:\MinGW\bin\g++.exe -shared -s build\temp.win32-2.7\Release\simple.o build\temp.win32-2.7\Release\simple_wrap.o build\temp.win32-2.7\Release\_simple.def -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o build\lib.win32-2.7\_simple.pyd
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0xce5): undefined reference to `create_list'
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0x170d): undefined reference to `dot'
collect2.exe: error: ld returned 1 exit status
error: command 'C:\MinGW\bin\g++.exe' failed with exit status 1
我有一种糟糕的感觉,我在这里遗漏了一些非常简单的东西,但我已经成功地在一个单独的 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(),'.'])])
如果需要其他代码,我很乐意 post 它们,但是同样,其他文件(simple.cc
和 simple.h
)是从 here 中逐字使用的.
所以,问题是:谁能指导我更正这个错误?
在此编译步骤中,输入文件被编译为 C++ 代码,symbol.cc 中的函数将被赋予与 C 不兼容的符号(名称改编)。
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_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o
解决该问题的一种方法是添加 swig_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)
...