Seite 1 von 2

Verfasst: Montag 8. August 2005, 06:39
von jens
Leonidas hat geschrieben:Jens, vielleicht fehlt beim gcc noch das -lpython?
Nein das hatte ich nicht! Das scheind zu funktionieren... Als Ergebnis erhalte ich eine *.o Datei. Es gibt jediglich eine Warnung:

Code: Alles auswählen

/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
Das dürfte aber wohl nicht schlimm sein, was?

Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Laut der Doku http://www.mingw.org/docs.shtml#compilingandbuilding soll es auch direkt gehen... Also versuche ich es mit gcc -I -lpython -o test test.c Obwohl ich hier ja das -lpython angegeben hab, kommen wieder diese "undefined reference"-Fehler...

Verfasst: Montag 8. August 2005, 09:55
von Leonidas
Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann. Klappen den Kompilationen von normalen Distutils-Modulen?
Du musst warscheinlich noch den Pfad dazu über -L/pfad/zu/den/libs angeben.

Bei PyPy wird doch auch die Python Stdlib neu in Python geschrieben (also das was noch nicht in Python ist)? Somit könnte man diese doch auch in IronPython nutzen, oder gibt es da irgendwelche größeren Probleme?

Verfasst: Montag 8. August 2005, 11:27
von ProgChild
jens hat geschrieben:Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen... Du musst die datei als .DLL oder .SO linken, damit du sie dann in Python importieren kannst.

Ich würde dir wirklich empfehlen die Distutils zu benutzen. Wie das geht, steht hier.

Verfasst: Montag 8. August 2005, 12:03
von jens
Leonidas hat geschrieben:Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann.
Ich hab nun beide angegeben... Tut's auch nicht:
gcc -I -l \Python\Python24\libs\python24.lib \Python\Python24\libs\libpython24.a -o test test.c

Code: Alles auswählen

In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
                 from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
d:\temp/ccsvaaaa.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/ccsvaaaa.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
d:\temp/ccsvaaaa.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
d:\temp/ccsvaaaa.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'

...
ProgChild hat geschrieben:Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen...
Tja, ich weiß nicht... Ich wollte es einfach mal versuchen... Hab aber keine Erfahrung mit gcc & Co :oops:

Verfasst: Montag 8. August 2005, 12:12
von Leonidas
Nein, jens, die Option ist -L nicht -l. -l gibt an gegen welche Bibliotheken du linkst und -L in welchem Ordner die Bibliotheken sind. Du musst sowohl bei -L den Ordner angeben als auch -lpython bzw. -lpython24.

Verfasst: Montag 8. August 2005, 12:22
von jens
Hm... Ein gcc -I -L \Python\Python24\libs -l python24.lib -l libpython24.a -o test test.c liefert folgendes:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: \Python\Python24\libs: No such file: Permission denied
collect2: ld returned 1 exit status

Verfasst: Montag 8. August 2005, 12:28
von jens
Ups :oops: So geht's wohl besser:
gcc -I -L\Python\Python24\libs\ -l python24.lib libpython24.a -o test test.c
Aber nicht Fehlerfrei:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
gcc: libpython24.a: No such file or directory
Obwohl in \Python\Python24\libs\ wirklich die libpython24.a vorhanden ist...

Hab auch noch einige Varianten Probiert, aber irgendwie bekomme ich kein richtiges Ergebnis:
gcc -I -Ld:\Python\Python24\libs -l python24.lib -o test test.c
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24.lib
collect2: ld returned 1 exit status

Verfasst: Montag 8. August 2005, 13:20
von ProgChild
jens hat geschrieben:
ProgChild hat geschrieben:Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen...
Tja, ich weiß nicht... Ich wollte es einfach mal versuchen... Hab aber keine Erfahrung mit gcc & Co :oops:
Wie willst du denn das Modul als Anwendung linken? Du hast doch garkeinen Startpunkt... Du hast nur Funktionen da drinn...

Dein Python Modul kann nur von dem Python Interpreter geladen und ausgeführt werden. Ohne den kannst du keine Ausführbare Datei bekommen.

Du hast also zwei Möglichkeiten: Entweder, du schreibst ein Python Modul, dass dein Modul aufruft, oder du schreibst ein C Programm, dass den Python Interpreter einbindet und dann ein Modul aufruft.

Einen anderen Weg sehe ich nicht.

Verfasst: Montag 8. August 2005, 13:42
von jens
ProgChild hat geschrieben:Du hast doch garkeinen Startpunkt... Du hast nur Funktionen da drinn...
Da hast du natürlich recht, wenn man sich nochmal http://www.python-forum.de/viewtopic.php?p=21786#21786 anschaut, gibt's nur die test()...

Aber ich glaube das erklärt nicht die Fehlermeldung beim gcc...

Wenn das alles klappten würde, könnte man sich doch schon vorstellen, das man eine Klasse definiert, die dann von einem mini C Programm aus aufgerufen wird...

Wie Praktikabel das ganze sein wird, weiß ich nicht...

Ich finde es nur schön, wenn man irgendwie doch eine echte EXE erzeugen könnte anstatt dem py2exe Kram... (Träumen darf man ja wohl noch :lol: )
Es kommen immer wieder Anwender, die nach einem Python-Compiler fragen. Also ich glaube das Interesse ist schon sehr groß und es würde Python für einige sehr viel Interessanter machen!

Der größte Nachteil von Py2exe ist es, das selbst kleinste Skripte richtig groß werden :(
Wobei eine andere Variante wäre noch, Python selber auf ein Minimum zu verkleinern... Das nur ein paar Dateien nötig sind, um überhaupt ein Mini-Python zu machen haben wir ja hier http://www.python-forum.de/viewtopic.php?t=3666 rausgefunden...
Ich hab nochmal eine Mini-Version erstellt und mit UPX die python.dll gepackt. Somit ist das mini-Python 852KB groß...

Wobei, hab gerade hier http://starship.python.net/crew/theller ... ompression unter Punkt 6 "7ZIP and UPX" gefunden, das es auch bei py2exe noch einiges Einsparungspotential gibt... Da bekommt man für 804KB schon eine fertige Geschichte... Naja, eine echte Compiler EXE wäre wahrscheinlich nochmal um einiges kleiner :(

Wie dem auch sei... Vielleicht wird PyPy uns irgendwann mal eine super Alternative liefern...

Ich wollte ja eigentlich nur mal eben gucken, was mit PyPy schon möglich ist... Das das jetzt so ausgeufert ist, war eigentlich nicht beabsichtigt...

Ich meine ich hab sowieso immer ein Python installiert und brauche nicht wirklich eine EXE ;)

Verfasst: Montag 8. August 2005, 14:53
von Leonidas
Jens, gcc nimmt bei -l nicht dateinamen, er macht das so: -lpython24 (ein Argument ohne Freizeichen) lädt libpython24.a, das heißt immer ohne das "lib"-Prefix. So wird aus libSDL.a -lSDL und aus libz.a -lz.

Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.

Verfasst: Montag 8. August 2005, 20:38
von jens
Leonidas hat geschrieben:Jens, gcc nimmt bei -l nicht dateinamen, er macht das so: -lpython24 (ein Argument ohne Freizeichen) lädt libpython24.a, das heißt immer ohne das "lib"-Prefix. So wird aus libSDL.a -lSDL und aus libz.a -lz.
Also wäre ein korrekter Aufruf so:
gcc -I -Ld:\Python\Python24\libs -lpython24 -o test test.c

Das bringt aber auch nur:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24
collect2: ld returned 1 exit status
Leonidas hat geschrieben:Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.
Du meinst das http://cvs.sourceforge.net/viewcvs.py/p ... e/#dirlist ???
Hört sich nett an:
Freeze a Python script into a binary.

Verfasst: Montag 8. August 2005, 21:01
von Leonidas
jens hat geschrieben:Das bringt aber auch nur:
In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
D:\Programme\tools\MinGW\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lpython24
collect2: ld returned 1 exit status
Hast du denn alles nötige dort drin? Die libpython24.a musste ich soweit ich mich erinnert kann selbst generieren.
Leonidas hat geschrieben:Hast du dir schon mal freeze aus dem Python-Tarball angeschaut? Das kommt glaube ich dem näher was du machen willst.
jens hat geschrieben:Du meinst das http://cvs.sourceforge.net/viewcvs.py/p ... e/#dirlist ???
Genau das, das findest du auch seit langem im Python-Sourcen-Tarball.

Verfasst: Dienstag 9. August 2005, 06:21
von jens
Leonidas hat geschrieben:Hast du denn alles nötige dort drin? Die libpython24.a musste ich soweit ich mich erinnert kann selbst generieren.
Nein, die ist im Python-Verz. unter libs vorhanden...