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 :P

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:

Code: Alles auswählen

[build_ext]
compiler=mingw32
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:

Code: Alles auswählen

[build_ext]
compiler=mingw32
Er compliliert doch schon mit dem MinGW (s.o.). Irgendwie ist die example.def fehlerhaft. Da sind die falschen Export Symbole eingetragen.

Vielleicht mal

Code: Alles auswählen

LIBRARY example.pyd
EXPORTS
initexample
in

Code: Alles auswählen

LIBRARY example.pyd
EXPORTS
init_example
ä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:

Code: Alles auswählen

[build_ext]
compiler=mingw32
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.