2016-07-11 2 views
3

Я пытаюсь настроить среду Python 2.7 под Windows 7, чтобы я мог скомпилировать расширение C++ для использования в Python. Поскольку я новичок в этом, я загрузил простой пример here и использовал файлы дословно. У меня также есть файл numpy.i в пути. Я установил свой компьютер с mingw (последняя версия) и swig (версия 3.0.10), а моя версия Python - 2.7.9. Я даже использовал эту среду для компиляции небольшой программы на C++ с помощью g ++ без проблем.Проблемы с SWIG, mingw32, distutils

Но при попытке построить «простое» расширение Python, упомянутое выше, я всегда получаю следующий вывод, указывающий на сбой (я включил команду, которую я выпустил в окне Windows cmd.exe в качестве первой строки ниже):

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(),'.'])]) 

Если другой код нужен, я с удовольствием разместим их, но опять же, другие файлы (simple.cc и simple.h) используются дословно here.

Итак, вопрос в том, может ли кто-нибудь помочь мне исправить эту ошибку?

+0

вы проверили, что оба MingW и питона являются 32-разрядные? –

+0

Я использовал стандартную программу установки mingw, и я понимаю, что она должна быть 32 бит. Немного по поиску в Google показывает, что mingw-64 был раздвоен из mingw32, и я, конечно же, не устанавливал эту вилку. Python определенно 32 бит. – cabraut

ответ

1

На этом этапе компиляции входной файл скомпилирован как код на C++, а функции в символе.cc будут выданы символы, которые несовместимы с C (название mangling).

C: \ MinGW \ Bin \ gcc.exe -mdll -О -Wall -IC: \ python27 \ Lib \ сайт-пакеты \ NumPy \ ядра \ включают -I. -IC: \ python27 \ включают -IC: \ python27 \ PC -c -o simple.cc строить \ temp.win32-2.7 \ Release \ simple.o

В этой компиляции шаг входной файл скомпилирован как C и символы для функций в символах.cc, как ожидается, будут разными.

C: \ MinGW \ Bin \ gcc.exe -mdll -O -Wall -ic: \ python27 \ Lib \ sitepackages \ NumPy \ ядро ​​\ включают -I. -IC: \ python27 \ включают -IC: \ python27 \ PC -c -o simple_wrap.c построить \ 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(),'.'])]) 

Другой вариант заключается в использовании extern "C" в simple.cc

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

Да, добавление 'swig_opts' в команду настройки сделало трюк! Большое спасибо! – cabraut

Смежные вопросы