QT - static build



  • partsoft schrieb:

    @It0101

    Nach der Installation von Python hat jetzt alles geklappt. Du musst in "build.cmd" dann nur den Pfad zu Python hinzufügen. Außerdem habe ich configure diesmal zusätzlich mit dem Parameter "-nomake examples" aufgerufen, denn die statisch gelinkten Beispiele belegen ca. 100 GB Speicherplatz 😮

    Aber wie versprochen schreibe ich die Tage noch eine vernünftige Anleitung dazu, dann auch für neuere Qt-Versionen.

    Mir ist zwischendurch auch der Speicherplatz ausgegangen. Mein "C:" ist ne SSD... naja ich habe jetzt nochmal bissel aufgeräumt und das "-nomake examples" mit reingenommen. Und dann schaue ich mal wie weit ich jetzt komme. 😉 Danke dir erstmal! Wird schon noch!



  • Anmerkung von mir: der Python-Installer generiert nicht standardmäßig die "python.exe" im Verzeichnis. Das muss man explizit im Python-Installer einrichten. Das war mein Fehler. Python installiert, aber keine Python.exe da 😉

    Kaum macht mans richtig.... 😉



  • Ich bin jetzt mit dem Build von QT fertig und habe den neuen Kit im QTCreator eingerichtet. Release-Buildprozess einer TestAnwendung hat auch soweit funktioniert.

    Nur startet die gebaute Executable trotzdem nicht.

    ".... kann nicht gestartet werden, da libgcc_s_dw2-1.dll auf dem Computer fehlt..."

    Kann das sein, dass hier bei meinem MINGW noch was nicht passt? Vermutlich muss ich im Projektfile noch eine zusätzliche Compileroption mitgeben, damit mingw dann auch die c++-Sachen statisch linkt, oder?

    Problem behoben:

    Im QTCreator-Projektfile gehört noch folgender Eintrag dazu, damit auch der Compiler es rafft:

    LIBS += -static
    

    Vielen Dank euch allen für eure Hilfe!

    Jetzt gehe ich erstmal hin und teste den Vorschlag von PicaSchaf 😉



  • Was mir noch aufgefallen ist. Mein simples Testprogramm mit einem einzigen Widget ist statisch gelinkt ganze 16MB groß...

    Ich habe damals Frontends mit CBuilder6 entwickelt und auch statisch gelinkt. Da waren selbst 2-3MB schon viel für ein Frontend mit Funktionialität.

    Aber 16MB für nix?

    Anmerkung: Der GCC-Aufruf sieht folgendermaßen aus:

    g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\testcomp.exe release/main.o release/mainwindow.o release/qroundprogressbar.o release/testcomp_plugin_import.o release/qrc_res.o release/moc_mainwindow.o release/moc_qroundprogressbar.o -lmingw32 -LD:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libqtmain.a -static D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libQt5Widgets.a -LD:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\platforms D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\platforms\libqwindows.a -lwinspool -lshlwapi D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libQt5PlatformSupport.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libQt5DBus.a -lnetapi32 D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libqtfreetype.a -LD:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqdds.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqicns.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqico.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqtga.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqtiff.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqwbmp.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\plugins\imageformats\libqwebp.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libQt5Gui.a -lcomdlg32 -loleaut32 -limm32 -lwinmm -lglu32 -lopengl32 -lgdi32 D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libqtpng.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libqtharfbuzzng.a D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libQt5Core.a -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmpr -lz D:\qt\qt-everywhere-opensource-src-5.7.1\qtbase\lib\libqtpcre.a

    Linkt QT automatisch einfach alles rein?



  • Ich habe das jetzt alles einmal sauber aufgeschrieben und auf der Website von Partsoft veröffentlicht:

    https://www.partsoft.de/index.php/de/support/cutex-1-0/15-qt-static-build



  • It0101 schrieb:

    Was mir noch aufgefallen ist. Mein simples Testprogramm mit einem einzigen Widget ist statisch gelinkt ganze 16MB groß...

    Ich habe damals Frontends mit CBuilder6 entwickelt und auch statisch gelinkt. Da waren selbst 2-3MB schon viel für ein Frontend mit Funktionialität.

    Aber 16MB für nix?

    Qt ist bestimmt umfangreicher als die Runtime vom CBuilder6



  • @PartSoft: danke! Sieht gut aus!

    1.Du könntest als Ergänzung noch diesen Link hinzufügen, wo alle möglichen Optionen für "configure" drin stehen.

    http://radekp.github.io/qtmoko/api/buildsystem/over-configure-options-qt-1.html

    Gerade, wenn man wie ich, SSL benötigt, findet man dort die notwendigen Schalter.

    2. Beim Pythoninstaller sollte man darauf hinweisen, dass er nicht vollautomatisch eine "python.exe" erzeugt, die für den QT-Buildprozess notwendig ist. Mein Pythoninstaller hat das erst nach Aufforderung getan. 😉



  • @FireFly: ich habs fast vermutet. Mich wundert schon der etwas umfangreiche Linkeraufruf mit sovielen Bibliotheken, aber vermutlich muss ich damit leben.



  • It0101 schrieb:

    @PartSoft: danke! Sieht gut aus!

    1.Du könntest als Ergänzung noch diesen Link hinzufügen, wo alle möglichen Optionen für "configure" drin stehen.

    http://radekp.github.io/qtmoko/api/buildsystem/over-configure-options-qt-1.html

    Gerade, wenn man wie ich, SSL benötigt, findet man dort die notwendigen Schalter.

    2. Beim Pythoninstaller sollte man darauf hinweisen, dass er nicht vollautomatisch eine "python.exe" erzeugt, die für den QT-Buildprozess notwendig ist. Mein Pythoninstaller hat das erst nach Aufforderung getan. 😉

    Also bei mir hat die Installation von Python problemlos geklappt, ich habe nur den Pfad geändert! Von daher lasse ich den Artikel so wie er ist, es soll ja auch nur eine grundlegende Anleitung sein.

    Ansonsten kannst du natürlich gerne auch selbst etwas dazu schreiben, der Supportbereich ist ein Forum 😉



  • Ich habe damals Frontends mit CBuilder6 entwickelt und auch statisch gelinkt. Da waren selbst 2-3MB schon viel für ein Frontend mit Funktionialität.

    Meinst du Borland C++ Builder Version 6? Der kam 2002 raus, das Teil ist also schon 15 Jahre alt! Meine Anwendungen mit Borland C++ 3.1 unter DOS waren auch wesentlich kleiner als meine heutigen Qt-Anwendungen 😉



  • Ja du hast wohl Recht. Ich hatte nicht bedacht, dass der CBuilder6 ja schon uralt ist. In der kurzen Zeit der Softwareentwicklung sind 15 Jahre ne Menge Holz.

    Dennoch stelle ich fest, dass der Trend immer mehr zu "hinklatschen" und nen größeren Speicherriegel / ne größere Platte einbauen geht, anstatt sich Gedanken über effizenze Ressourcennutzung zu machen.



  • It0101 schrieb:

    Ja du hast wohl Recht. Ich hatte nicht bedacht, dass der CBuilder6 ja schon uralt ist. In der kurzen Zeit der Softwareentwicklung sind 15 Jahre ne Menge Holz.

    Dennoch stelle ich fest, dass der Trend immer mehr zu "hinklatschen" und nen größeren Speicherriegel / ne größere Platte einbauen geht, anstatt sich Gedanken über effizenze Ressourcennutzung zu machen.

    Naja hier vergleichst du auch Äpfel mit birnen.
    Das Qt Framework bietet deutlich mehr als der CBuilder6 damals bestimmt geboten hat.

    Seit Qt5.7 oder erst mit 5.8 kann man Qt modularer bauen, damit man nur die Teile im binary landen, welche auch wirklich nenötigt werden.
    https://blog.qt.io/blog/2010/10/26/qt-is-going-modular/

    Was eventuell auch helfen könnte wäre dem linker zu nur das zu linken was auch wirklich benötigt wird und den rest nicht mit rein linken.
    Beim gcc geht das mit folgender compiler option: -Wl,--as-needed



  • Das ging vor 5.7 und 5.8 seit Qt 4 schon. Nur hat man es nicht marketingmäßig aufgeblasen und ihm einen koolen Namen wie Qt Lite gegeben. Nennt sich qfeatures.txt und ist eines unserer Haus und Hofgeschäfte.
    Qt Customizing und Bootstrapping für Embedded Systeme. Wir haben zB. eine Fastboot Demo in der eine einfache Qt Anwendung mit knapp unter 1 MiB (App + Qt + Abhängigkeiten) in rund 500ms startet (von Power On, über boot bis zur benutzbaren Anwendung). Alles kein Thema, nur eine Frage von Aufwand/Nutzen 😉



  • @picaschaf

    Kannst du mir zu den Qt features einen Tipp geben?
    Ich möchte einfach ein minimales Qt 5.8 bauen, jedoch scheinen viele features mit anderen zusammenzuhängen und es gibt wohl auch keine Liste, wo die ganzen Abhängigkeiten ganz genau beschrieben sind.
    Die in qfeatures.txt sind nämlich nicht komplett, Beispiele:

    (wollte deaktivieren : wird benötigt von)

    semaphore: sharedmemory
    xmlstream/reader/writer: uic
    accessibility: error: Project ERROR: Unknown module(s) in QT: accessibility_support-private
    sessionmanager: qwindowsbackingstore
    pdf/printer/printpreviewwidget/printdialog/printpreviewdialog: plugins\printsupport\windows\main.cpp
    texthtmlparser/dom: qttools, setHtml (?)
    image_heuristic_mask: qttools
    style-windows: qttools

    Und das ist bestimmt nur ein kleiner Teil.



  • Was möchtest du denn genau erreichen? Sind dir ein paar kB wirklich der Aufwand wert? Idr. ist die Verwendung von Tools wie UPX Packer einfacher und bringt mehr Einsparungen.
    Du wirst schnell Compilerfehler bekommen, da dieser tiefe Eingriff nicht Teil der CI des Qt Project ist. Mit ein Grund warum wir dafür unseren Kunden einen solchen Dienst anbieten.

    Wenn du es versuchen möchtest empfehle ich dir das Projekt qttools/src/qconfig/qconfig.pro. Das ist ein GUI in das du die qfeatures.txt lädst, die Festures abwählen die du nicht brauchst, speichern und dem configure mitgeben.

    Wenn du wo hängst, einfach nochmal fragen oder mich direkt anschreiben.



  • picaschaf schrieb:

    Was möchtest du denn genau erreichen? Sind dir ein paar kB wirklich der Aufwand wert?

    Hier klingt das aber besser :):

    picaschaf schrieb:

    ... Qt Anwendung mit knapp unter 1 MiB (App + Qt + Abhängigkeiten) ...

    Bin außerdem ein bisschen ein unverbesserlicher Mikrooptimierer 🙄

    picaschaf schrieb:

    Idr. ist die Verwendung von Tools wie UPX Packer einfacher und bringt mehr Einsparungen.

    Ganz schlechte Erfahrungen gemacht (AntiVirus-Programme).

    picaschaf schrieb:

    Wenn du es versuchen möchtest empfehle ich dir das Projekt qttools/src/qconfig/qconfig.pro. Das ist ein GUI in das du die qfeatures.txt lädst, die Festures abwählen die du nicht brauchst, speichern und dem configure mitgeben.

    Danke, werd ich mir mal angucken.



  • Ja, das ist aber bitte keine generelle Aussage. Es kommt natürlich immer darauf an was du genau an Modulen nutzt. Verwendest du die webEngine bist du natürlich schnell bei 20-50 MiB, egal was du noch mit den features drehst. Mit denen bekommst du die letzten 100 KiB-ein paar MiB je nach Umfang.
    Die Minidemo von uns ist ein einfaches Qt Example das QtCore und QtWidgets nutzt. Der eigentliche Nutzen war das schnelle Booten und hatte einen Zwitaufwand von 2-3 Tagen für die Optimierung. Hast du ein "unpassendes" Problem wie zB. eine Kamera deren Treiber erst initialisiert werden müssen kann sich der Aufwand schnell vervielfachen.

    Unverbesserlicher Mikrooptimierer hört sich ja gut und schön an, aber in der Praxis bringt das unweigerlich Probleme. Du verschwendest Zeit, die an anderer Stelle besser aufgehoben wäre obwohl die Anwendung ihre Anforderungen bereits erfüllt, bringst potenzielle Sicherheits- und Absturzrisiken mit rein durch das Herausreißen von Kleinigkeiten die den potentiellen Ärger nicht wert sind und machst die Anwendung schlechter Wart- und Erweiterbar. Wartbarkeit und Erweiterbarkeit stehen nach der Erfüllung der Anforderung über allem.

    Bzgl. der Probleme mit den AntiViren Tools würde ich das Problem an der Ursache angehen, nicht am Symptom 😉


Anmelden zum Antworten