QT für alte Plattform ohne SSE/SSE2 kompillieren



  • Servus,

    Durch Zufall ist mir ein alter POS-PC mit Touch-Panel in die Hände gefallen. Intern werkelt da ein Via Erza C3 Prozessor, welcher kein SSE/SSE2 instruction set unterstützt, welches bei den Qt-Installationspaketen von vornherein aktiviert ist.

    Nun möchte ich den PC aber mit einem kleinen Qt-Programm verwenden. Auf dem PC selbst läuft noch Windows Xp (kommt eh kein Internet dran). Auf dem IDE-PC läuft Windows 7, mingw32 als Compiler und Qt 4.8.6.

    Ohne irgendwelche Änderungen an der Qt-Bibliothek startet das fertige Programm auf dem Kassen-PC natürlich nicht - es kommt nur die Fehlermeldung
    "Die Anwendung konnte nicht korrekt gestartet werden (0x000001d).
    Klicken Sie auf "OK" um die Anwendung zu schließen."

    Das liegt wohl an der fehlenden SSE/SSE2 Unterstützung.

    Also habe ich bereits die Opensource Qt-Bibliothek heruntergeladen und mit dem mingw32 Compiler mit den Optionen -no-sse und -no-sse2 neu kompilliert.

    Das nun übersetzte fertige Programm scheint zumindest kurzzeitig auf dem Kassen-PC zu starten. Es taucht für 1 Sekunde ohne Fehler im Taskmanager auf und beendet sich dann direkt wieder. Von der Gui jedoch ist nix zu sehen.

    Auf anderen PCs funktioniert das Programm jedoch ohne Probleme.

    jo...ziemlich beschissene Ausgangssituation - vor allem da ich kaum hilfreiche bzw. ähnliche Problemstellungen dazu gefunden habe. Ist ja an sich auch bescheuert für alte Hardware Programme zu erstellen. Allerdings lässt sich bei dem Kassen-PC das Touch-Panel nicht vom Mainboard bzw. mit anderer Hardware betreiben. Also bitte nicht über Sinn und Unsinn diskutieren 😉

    Hat da eventuell noch jemand ne Idee, was ich bei der Verwendung von Qt unter WinXP mit alter Hardware zu beachten habe?



  • Einfach reindebuggen, was da passiert. Die einzige Stelle, wo Qt SSE verwendet ist glaube ich beim Zeichnen, in QDrawHelper.cpp oder so. Und da wird sauber geprüft, was die CPU so alles unterstützt. Geht auch komplett ohne SSE, MMX usw.



  • einfach reindebuggen ist deshalb kompliziert, da der QT-Creator nicht auf dem Kassen-PC läuft - eben des fehlenden SSE/SSE2 wegens.

    Also müsste ich den QT Creator erstmal neu erstellen um überhaupt debuggen zu können 😞



  • Debuggen ohne Sources ist zwar unangenehm, aber zumindest ein WinDBG oder aehnliches solltest du doch zum laufen kriegen, dann siehst du wenigstens, bei welchen Instruktionen es kracht. Erwarte nicht den Komfort einer IDE, aber man kann damit arbeiten.



  • Du kannst dir beim Crash (wenns einen Crash gibt) einen Dump erzeugen lassen und den Dump dann auf dem Entwicklerrechner analysieren. Oder du startest auf dem Zielrechner einen Remote Debugger.



  • So, hatte jetzt mal wieder Zeit mich an das Problem zu setzen.

    WinDB gibt mir auf dem Ziel-PC folgendes aus:

    Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    CommandLine: "C:\Dokumente und Einstellungen\User1\Eigene Dateien\Neuer Ordner\Kasse.exe"
    Symbol search path is: *** Invalid ***
    ****************************************************************************
    * Symbol loading may be unreliable without a symbol search path.           *
    * Use .symfix to have the debugger choose a symbol path.                   *
    * After setting your symbol path, use .reload to refresh symbol locations. *
    ****************************************************************************
    Executable search path is: 
    ModLoad: 00400000 090c3000   image00400000
    ModLoad: 7c910000 7c9c6000   ntdll.dll
    ModLoad: 7c800000 7c908000   C:\WINDOWS\system32\kernel32.dll
    ModLoad: 77da0000 77e4a000   C:\WINDOWS\system32\ADVAPI32.DLL
    ModLoad: 77e50000 77ee2000   C:\WINDOWS\system32\RPCRT4.dll
    ModLoad: 77fc0000 77fd1000   C:\WINDOWS\system32\Secur32.dll
    ModLoad: 77ef0000 77f39000   C:\WINDOWS\system32\GDI32.dll
    ModLoad: 7e360000 7e3f1000   C:\WINDOWS\system32\USER32.dll
    ModLoad: 76330000 7634d000   C:\WINDOWS\system32\IMM32.DLL
    ModLoad: 77be0000 77c38000   C:\WINDOWS\system32\msvcrt.dll
    ModLoad: 774b0000 775ed000   C:\WINDOWS\system32\OLE32.dll
    ModLoad: 770f0000 7717b000   C:\WINDOWS\system32\OLEAUT32.DLL
    ModLoad: 7e670000 7ee91000   C:\WINDOWS\system32\SHELL32.DLL
    ModLoad: 77f40000 77fb6000   C:\WINDOWS\system32\SHLWAPI.dll
    ModLoad: 76af0000 76b1e000   C:\WINDOWS\system32\WINMM.DLL
    ModLoad: 72f70000 72f96000   C:\WINDOWS\system32\WINSPOOL.DRV
    ModLoad: 71a10000 71a27000   C:\WINDOWS\system32\WS2_32.dll
    ModLoad: 71a00000 71a08000   C:\WINDOWS\system32\WS2HELP.dll
    ModLoad: 6e940000 6e962000   C:\MinGW\bin\libgcc_s_dw2-1.dll
    ModLoad: 6fc40000 6fd3a000   C:\MinGW\bin\libstdc++-6.dll
    (1d0.760): Break instruction exception - code 80000003 (first chance)
    eax=00341eb4 ebx=7ffdf000 ecx=00000005 edx=00000020 esi=00341f48 edi=00341eb4
    eip=7c91120e esp=0022fb20 ebp=0022fc94 iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
    ntdll!DbgBreakPoint:
    7c91120e cc              int     3
    0:000> g
    ModLoad: 773a0000 774a3000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
    ModLoad: 5d450000 5d4ea000   C:\WINDOWS\system32\comctl32.dll
    (1d0.760): Illegal instruction - code c000001d (first chance)
    (1d0.760): Illegal instruction - code c000001d (!!! second chance !!!)
    eax=00000001 ebx=00000028 ecx=01523990 edx=77c31ae8 esi=00ca56c2 edi=00b5f558
    eip=6fcb6cdf esp=0022fee0 ebp=0022ff18 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000206
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\MinGW\bin\libstdc++-6.dll - 
    libstdc___6!Znwj+0xf:
    6fcb6cdf 0f44d8          cmove   ebx,eax
    

    So wies ausschaut nutzen die Libs von MinGW den SSE/SSE2 Befehlssatz (code c000001d). Mir will es gerade nicht in den Kopf, wie ich das abschalten kann...
    Kann mir da jemand das Brett vor dem Kopf entfernen? Dankeschön 😉



  • Im Compiler SSE Optimierung abschalten?



  • Wie mach ich das?

    Ich werd irgendwie nicht mit der Doku von MinGW schlau, welche Komanndozeilenargumente ich im Qt Creator anfügen muss, damit das SSE abgeschalten wird...

    Wenn ich -march=i386 eintrage, komm ein Fehler: "invalid option -- a" beim Versuch das Projekt zu kompillieren.

    Edit: Im .pro-file habe ich für QMake die Option QMAKE_CFLAGS_RELEASE+=-march=i386 hinzugefügt. Geändert hat sich an der WinDbg-Ausgabe nichts...



  • Hast du inzwischen eine Lösung zu dem Problem gefunden?


Anmelden zum Antworten