Cython/MinGW gcc: Warum funktioniert 32-Bit-exe nicht?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
P1234
User
Beiträge: 2
Registriert: Dienstag 22. Mai 2018, 22:55

Mein Betriebssystem ist Windows 10 64 Bit.

Folgendes habe ich installiert:

- Python 64bit

- Python 32bit

- "MinGW-w64 - for 32 and 64 bit Windows" (https://sourceforge.net/projects/mingw- ... rce=navbar)
um mit dem enthaltenen gcc eine exe zu erstellen

- Cython um mein Python-Programm in eine c-Programm zu verwandeln

Das Python-Programm example.py:

Code: Alles auswählen

#Example (Hello, World):
import tkinter
 
tk = tkinter.Tk()
frame = tkinter.Frame(tk, relief="ridge", borderwidth=2)
frame.pack(fill="both",expand=1)
label = tkinter.Label(frame, text="Hallo Welt!")
label.pack(expand=1)
button = tkinter.Button(frame,text="OK",command=tk.destroy)
button.pack(side="bottom")
 
tk.mainloop()
Umwandlung in ein c-Programm:

Code: Alles auswählen

cython --embed example.py
Umwandlung in eine 64-Bit-Exe:

Code: Alles auswählen

gcc -Wl,--subsystem,windows -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python37\include -LC:\Python37\libs example.c -lpython37 -o example.exe
Die 64-Bit example.exe lässt sich ohne Fehlermeldung starten.

Das Compilieren einer 32-Bit-Exe funktioniert zwar ohne Fehlermeldung:

Code: Alles auswählen

gcc -Wl,--subsystem,windows -m32 -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python37-32bit\include -LC:\Python37-32bit\libs example.c -lpython37 -o example.exe
Doch beim Versuch, die 32-Bit example.exe zu starten, bekomme ich ein Fenster mit folgender Fehlermeldung:

example.exe - Anwendungsfehler
Die Anwendung konnte nicht gestartet werden.
(0xc000007b). Klicken Sie auf 'OK', um die Anwendung zu
schließen. OK

Woran kann das liegen?
Muss ich mein gcc-Kommando abändern und wenn ja wie?
Oder stimmt etwas anderes nicht?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das -DMS_WIN64 finde ich ja schon fishy. Was sagt denn Google zu dem Fehlercode? Und schau dir mal die resultierende EXE an, ob die zb 64Bit Abhängigkeiten hat. Mit sowas wie depwalker oder ähnlichen Tools.
P1234
User
Beiträge: 2
Registriert: Dienstag 22. Mai 2018, 22:55

Offenbar wurde für die Erzeugung der 32-Bit-Exe die 64-Bit-python37.dll aus dem 64-Bit-Verzeichnis
c:\Python37 eingebunden und kann deshalb nicht starten.

Wenn ich die example.c ins 32-Bit-Python-Verzeichnis c:\Python37-32bit verschiebe und
auch den Befehl

Code: Alles auswählen

gcc -Wl,--subsystem,windows -m32 -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python37-32bit\include -LC:\Python37-32bit\libs example.c -lpython37 -o example.exe
von dort ausführe, wird die 32-Bit-python37.dll aus dem Verzeichnis C:\Python37-32bit
eingebunden und ich kann die 32-Bit-Exe ausführen.

Jetzt habe ich aber noch eine Frage:

Wie kann ich mit gcc die 32-Bit-Exe aus einem beliebigen Verzeichnis heraus erstellen,
indem ich den Pfad zur 32-Bit python37.dll als Parameter angebe?

Ich habe es so versucht (Parameter -lC:\Python37-32bit\python37)

Code: Alles auswählen

gcc -Wl,--subsystem,windows -m32 -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python37-32bit\include -LC:\Python37-32bit\libs example.c -lC:\Python37-32bit\python37 -o example.exe
und so (Parameter -lc:\Python37-32bit\python37.dll)

Code: Alles auswählen

gcc -Wl,--subsystem,windows -m32 -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python37-32bit\include -LC:\Python37-32bit\libs example.c -lC:\Python37-32bit\python37.dll -o example.exe
Beides ergibt jedoch die Meldung:

C:/Program Files/mingw-w64/x86_64-7.3.0-win32-sjlj-rt_v5-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lc:\Python37-32bit\python37.dll (bzw. ohne .dll für Fall eins)
collect2.exe: error: ld returned 1 exit status

Also was muss ich für den Parameter l angeben, damit die python37.dll aus dem
Verzeichnis c:\Python37-32bit eingebunden wird?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit -L gibst du einen Pfad an, und mit -l eine Library. Du musst das also aufteilen.
Antworten