2016-07-11 31 views
3

Ich habe versucht, eine Python 2.7-Umgebung unter Windows 7 einzurichten, damit ich eine C++ - Erweiterung für die Verwendung in Python kompilieren kann. Da ich neu hier bin, habe ich ein einfaches Beispiel here heruntergeladen und die Dateien wörtlich verwendet. Ich habe auch eine numpy.i Datei im Pfad. Ich habe meinen Computer mit mingw (neueste Version) und swig (v. 3.0.10) eingerichtet, und meine Python-Version ist 2.7.9. Ich habe sogar diese Umgebung verwendet, um ein kleines C++ - Programm mit g ++ ohne Probleme zu kompilieren.Probleme mit SWIG, mingw32, distutils

Wenn ich versuche, die oben erwähnte "einfache" Python-Erweiterung zu erstellen, erhalte ich immer die folgende Ausgabe, die auf Fehler hinweist (ich habe den Befehl, den ich im Windows cmd.exe-Fenster ausgegeben habe, als erste Zeile darunter eingefügt):

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 

ich habe eine schreckliche Gefühl, dass ich etwas sehr einfach hier fehle, aber ich habe diese identischen Dateien in einer separaten Cygwin-Umgebung ohne Probleme erfolgreich zu kompilieren verwaltet (und ja, ist es für mich wünschenswert in der Lage sein, dies in einer Nicht-Cygwin-Umgebung zu tun).

Ich möchte diese Frage nicht mit zu viel Code ersticken, aber als Referenz sind hier die Dateien simple.i und setup.py, die ich verwende.

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

Wenn ein anderer Code erforderlich ist, ich bin glücklich, sie zu schreiben, aber wieder, die anderen Dateien (simple.cc und simple.h) sind wörtlich aus here verwendet.

So ist die Frage: kann mir jemand helfen, diesen Fehler zu korrigieren?

+0

Haben Sie überprüft, dass beide MingW und python sind 32-Bit? –

+0

Ich habe das Standard-Mingw-Setup-Programm verwendet, und mein Verständnis ist, dass es 32 Bit sein sollte. Ein bisschen Googeln zeigt, dass mingw-64 von mingw32 gegabelt wurde, und ich habe diese Gabel sicherlich nicht installiert. Das Python ist definitiv 32 Bit. – cabraut

Antwort

1

In diesem Übersetzungsschritt wird die Eingabedatei als C++ - Code kompiliert, und die Funktionen in symbol.cc erhalten Symbole, die nicht mit C (Name Mangling) kompatibel sind.

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

In dieser Zusammenstellung die Eingabedatei kompiliert wird Schritt als Es wird erwartet, dass der C-Code und die Symbole für die Funktionen in symbols.cc unterschiedlich sind.

C: \ MinGW \ bin \ gcc.exe -mdll -O -Wall -IC: \ Python27 \ lib \ sitepackages \ numpy \ core \ umfassen -I. -IC: \ Python27 \ include -IC: \ Python27 \ PC -c simple_wrap.c -o bauen \ temp.win32-2.7 \ Release \ simple_wrap.o

Eine Möglichkeit, das Problem zu beheben ist swig_opts hinzufügen

setup(name='matt_simple_test', version='1.0', 
     ext_modules=[Extension('_simple', ['simple.cc', 'simple.i'], 
        swig_opts=["-c++"], 
        include_dirs = [numpy.get_include(),'.'])]) 

Eine weitere Option ist extern "C" in simple.cc verwenden

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

Ja, das Hinzufügen der 'swig_opts' zum Setup-Befehl hat den Trick gemacht! Danke vielmals! – cabraut