Seite 1 von 1
swig problem
Verfasst: Sonntag 13. November 2005, 13:28
von sonium
Ich versuche gerade mit Swig und MinGW ein Python Modul hin zu bekommen, bzw dieses
Tutorial zu befolgen. Allerdings läuft es immer auf diesen Fehler hinaus:
Irgendwie vermute ich, dass er die libpython24.a nicht findet. Wenn ja, wie habe ich die einzubinden?
Code: Alles auswählen
C:\pymodule>python setup.py build -cmingw32
running build
running build_ext
building 'example' extension
swigging example.i to example_wrap.c
C:\swig\swig.exe -python -o example_wrap.c example.i
creating build
creating build\temp.win32-2.4
creating build\temp.win32-2.4\Release
C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python24\include -IC:\Pytho
n24\PC -c example_wrap.c -o build\temp.win32-2.4\Release\example_wrap.o
C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python24\include -IC:\Pytho
n24\PC -c example.c -o build\temp.win32-2.4\Release\example.o
example.c:20:3: warning: no newline at end of file
writing build\temp.win32-2.4\Release\example.def
creating build\lib.win32-2.4
C:\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.4\Release\example
_wrap.o build\temp.win32-2.4\Release\example.o build\temp.win32-2.4\Release\exam
ple.def -LC:\Python24\libs -LC:\Python24\PCBuild -lpython24 -lmsvcr71 -o build\l
ib.win32-2.4\example.pyd
Cannot export initexample: symbol not defined
error: command 'gcc' failed with exit status 1
Verfasst: Sonntag 13. November 2005, 16:59
von ProgChild
Ist denn die Funktion initexample in der von SWIG erzeugten C Datei example_wrap.c vorhanden und nicht als static deklariert?
Verfasst: Sonntag 13. November 2005, 19:17
von sonium
also ich finde keine initexample funktion in der datei... aber das ganze zeug darin verstehe ich auch herzlich wenig.
hier mal die
example_wrap.c
Verfasst: Sonntag 13. November 2005, 21:04
von ProgChild
Die Funktion könnte auch noch in der example.c stecken, aber laut Tutorial wohl ehr nicht...
In deiner example_wrap.c ist eine Funktion init_example. Schau mal, ob du das Modul nicht versehentlich _example statt example genannt hast.
Verfasst: Sonntag 13. November 2005, 22:08
von sonium
in der von swig erstellten example.py steht tatsächlich "import _example"
allerdings hab ich nie eine datei oder sonstiges so benannt.
Ich hab jetzt mal
meine gesammten Files hochgeladen.
wenn ich das mal läuft schreib ich ein Tutorial wies richtig geht

Verfasst: Sonntag 13. November 2005, 22:39
von ProgChild
Also bei mir unter Linux kann ich es einfach mit python setup.py build übersetzten.
Das muss also irgendwie an MinGW liegen, schätzte ich...
Verfasst: Montag 14. November 2005, 13:14
von Leonidas
Wie wärs mit folgender setup.cfg, die im Ordner der setup.py liegen muss:
So habe ich die meisten
WindowsBinaries kompiliert.
Verfasst: Montag 14. November 2005, 14:13
von ProgChild
Leonidas hat geschrieben:Wie wärs mit folgender setup.cfg, die im Ordner der setup.py liegen muss:
Er compliliert doch schon mit dem MinGW (s.o.). Irgendwie ist die
example.def fehlerhaft. Da sind die falschen Export Symbole eingetragen.
Vielleicht mal
in
ändern.
Verfasst: Montag 14. November 2005, 14:51
von Leonidas
Müsste es nicht trotzdem statt python build -cmingw32 python setup.py build_ext -cmingw32 heißen?
Verfasst: Montag 14. November 2005, 15:00
von ProgChild
Leonidas hat geschrieben:Müsste es nicht trotzdem statt python build -cmingw32 python setup.py build_ext -cmingw32 heißen?
build beinhaltet
build_ext, soweit ich weis.
Verfasst: Montag 14. November 2005, 15:11
von Leonidas
ProgChild hat geschrieben:build beinhaltet build_ext, soweit ich weis.
Ja, bdist_win beinhaltet auch build und somit build_ext, akzeptiert aber trotzdem keine --compiler Option.
Ich habe den ganzen Spaß auch bei mir getestet, mit SWIG 1.3.27:
example.c
Code: Alles auswählen
/* A global variable */
double Foo = 3.0;
/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}
example.i:
Code: Alles auswählen
%module example
%inline %{
extern int gcd(int x, int y);
extern double Foo;
%}
setup.cfg:
setup.py
Code: Alles auswählen
import distutils
from distutils.core import setup, Extension
setup(
ext_modules = [Extension("_example", ["example.i","example.c"])]
)
Dann mit
python setup.py build_ext aufgerufen, was dann funktioniert hat und mir die passende Datei _example.pyd kompiliert hat.
Achja, libpython24.a liegt im Libs-Ordner, zusammen mit den ganzen .lib Dateien, der python24.lib und der python24.dll (vermutlich unnötig viele Dateien dort, stören aber nicht).
Verfasst: Montag 14. November 2005, 15:28
von ProgChild
Leonidas hat geschrieben:ProgChild hat geschrieben:build beinhaltet build_ext, soweit ich weis.
Ja, bdist_win beinhaltet auch build und somit build_ext, akzeptiert aber trotzdem keine --compiler Option.
Warum kann dann sonium mir der Option den MinGW benutzten

Verfasst: Montag 14. November 2005, 15:37
von Leonidas
ProgChild hat geschrieben:Warum kann dann sonium mir der Option den MinGW benutzten

Tja, benutzen geht wohl

Funktionieren tuts halt bei ihm nicht, deswegen habe ich ihm eine Alternative vorgeschlagen. Aber bei mir gab es Anfangs auch den gleichen Fehler.
Verfasst: Dienstag 15. November 2005, 21:48
von sonium
tja, jetzt heist es obwohl ich .Net 2.0 und SDK installiert hab (dauerte ganz schön lange)
Code: Alles auswählen
C:\pymodule>python setup.py build_ext
running build_ext
error: The .NET Framework SDK needs to be installed before building extensions f
or Python.
irgendwie glaub ich, mag mich swig nicht.
Verfasst: Dienstag 15. November 2005, 22:02
von Leonidas
Und mein Tipp mit MinGW hat bei dir nicht funktioniert?
Hast du eigentlich MinGW und MSYS+MSYS-DTK?
Verfasst: Mittwoch 16. November 2005, 16:35
von sonium
hab ich jetzt auch installiert, aber die fehlermeldung bleibt die gleiche. Auch wenn ich es aus der MSYS Shell heraus ausfürhe

Verfasst: Mittwoch 16. November 2005, 17:47
von Leonidas
sonium hat geschrieben:Oder muss ich das ganze aus der MSYS Shell heraus ausführen?
Ich mache es jedenfalls.
Hast du die setup.cfg im gleiche Ordner?
Ich mache es immer so: im MSYS-home einen Ordner anlegen, dort alle Dateien reinpacken und mit der Shell dann die setup.py anschubsen.