• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C++ | VS2012 | POCO] GUI Library gesucht

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.454
Ort
/dev/null
Dumme Frage, weil ich grad durcheinander bin wie ein Rührei: Bei einer 32bit Anwendung muss ich nur die x86 Version mitgeben, und nicht noch die x64, nur weil das Programm auch auf 64bit läuft...oder? Logischerweise wär ja nur die x86 nötig...oder doch nich?:confused:
Korrekt.
 

Larius

OutOfOrder

Registriert
12 Juli 2013
Beiträge
5.792
Ich werde es mir dann nochmal anschauen, meines Wissens nach (bezieht sich jetzt aber auf Visual Studio 2010 da ich das das letzte Mal für sowas verwendet hab) war nur die Umstellung auf Release notwendig damit es funktioniert. Ich werd es dann später mit VS 2012 ausprobieren.

Mah, scheinbar dürft das mit dem Versionsanstieg von 2010 auf 2012 abgeändert worden sein. In der Projekteinstellung unter C++/Code Generation/Runtime Library sollte für den Release /MT (Multithreaded) eingestellt sein. Dann sollte es auch ohne Runtime funktionieren.

Bzgl. dem msvcpxxx.dll: Ich glaub das wird in einem Windows-Ordner gesucht, bin mir aber nciht sicher. Mit den richtigen Einstellungen sollte es aber auch ohne funktionieren da Microsoft ansonsten recht schnell baden gegangen wäre (wer würde eine DLL mitliefern möchten wenn man mitetls GCC/MinGW Code generiert der ohne die notwendige DLL auskommt).

Bzgl. deiner Frage, Musv: Wenn ich irgendwelche Libs wie bsp. QT oder die POCO Lib von tophirsch verwende muss ich die natürlich zur fertig kompilierten Exe dazupacken oder auf die DLLs verweisen, damit es dann funktioniert. Darauf bezog sich mein "DLLs dazupacken" ;)
 

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.454
Ort
/dev/null
Bzgl. dem msvcpxxx.dll: Ich glaub das wird in einem Windows-Ordner gesucht, bin mir aber nciht sicher. Mit den richtigen Einstellungen sollte es aber auch ohne funktionieren da Microsoft ansonsten recht schnell baden gegangen wäre (wer würde eine DLL mitliefern möchten wenn man mitetls GCC/MinGW Code generiert der ohne die notwendige DLL auskommt).
Bin mir da nicht wirklich sicher. Aber das Zauberwort heißt hier WinSxS. Das ist ein Verzeichnis im Windows, in dem die ganzen Runtimes abgelagert werden. Und man kann beim Compilieren angeben, mit welcher Runtime das Compilat laufen soll. Allerdings wurde das Prinzip, wo und wie man die Version einträgt M$-typisch von Version zu Version (2005-2008-2010-2012) geändert.

Ich blick da nicht wirklich durch bei den ganzen Runtimes. Aber ich hab mir schon die Haare gerauft über soviel Umständlichkeit, auf die ich da schon gestoßen bin. Schön ist das nicht.
 

tophirsch

erster Hirsch am Platze

Registriert
6 Aug. 2013
Beiträge
929
Ort
hinterm Wald
  • Thread Starter Thread Starter
  • #24
So, falls noch jemand daran interessiert ist, ich habe einen Batzen Zeit investiert und Qt selbst kompiliert und versucht zum Laufen zu bringen.
Nun wie versprochen nochmal eine genauere Beschreibung meiner Vorgehensweise für einen minimalistischen static Build von Qt.
Vieles beruht auf Try-and-Error und möglicherweise ist nicht alles 100% korrekt, was ich da schreibe, aber für mich hat's zumindest funktioniert.

Es funktioniert auch noch nicht Alles, wie es soll. Aber ich habe grad keine Zeit(und auch nicht mehr die Kraft :D) das alles noch genauer zu untersuchen. Was ich wollte funktioniert erstmal. Was nicht geht fasse ich mal in einer "TODO-Liste" zusammen, vielleicht fühl ich mich später noch mal dazu bemüßigt, weiter dran zu arbeiten. Oder jemand Anderes... :coffee:

TODO:
  • Ich konnte mit VS(mit Addin) bisher noch keine funktionierende Executable zaubern. Der Linker beschwert sich ständig über fehlende Lib's. Mit dem Build vom binary Package(shared Version, die Qt-dll's benötigt) funktioniert es aber, könnte also für die Entwicklung erstmal genutzt werden. Für release kann man dann man dann das Projekt im QtCreator kompilieren, mit dem funktioniert mein Build(* siehe nächster Punkt).
  • QtQuick-Anwendung und QtQuick UI funktionieren bisher nicht, nur Qt-Widgets-Anwendungen("gewöhnliche" Steuerelemente). Reicht mir erstmal, deshalb forsche ich daran jetzt vorerst nicht mehr weiter.



Qt5.0.2 - Minimalistischer static Build


Der Build von Qt ist wirklich aufwändiger und komplizierter, als ich dachte. Es gibt zwar ne menge Anleitungen dazu im Netz, aber dennoch wurden in keiner Beschreibung alle Probleme beschrieben, die bei mir auftraten.
Das liegt garnicht mal daran, dass die anderen Beschreibungen unvollständig sind. Es lioegt daran, dass Qt ständig weiterentwickelt wird und sich somit manchmal drastische Änderungen ergeben, auch was den Buildvorgang angeht.
Meine Beschreibung bezieht sich auch ausschließlich auf meine Erfahrungen mit Qt 5.2.0 mit VS2012 als Compiler unter Win7 64bit. Aber kompiliert wird ausschließlich 32bit.

Ich habe vor dem Build das binary Package von Qt installiert. So hat man eine Version mit allen Features für die Entwicklung. Für release habe ich dann einen eigenen Minimal-Build kompiliert, der Qt statisch linkt damit man keine Qt-Dlls mitgeben muss.

Ziel des ganzen Unternehmen, was hier beschrieben ist, soll ein sogenannter static Build sein. Das bedeutet, dass die Bibliotheken von Qt statisch gelinkt werden, somit keine Qt-DLL's zum Programm mitgegeben werden müssen und mann nur eine einzige Ausführbare Datei verteilen muss. Fast. Der Build ist noch abhängig von der MSVC Runtime, man muss also doch 2,3 DLL's mitverteilen, oder die Benutzer zur installation des Redist-Packages bewegen.
Die Beschreibung enthält hinweise, wie man auch diese Abhängigkeit statisch linken kann, das habe ich aber nicht getestet, da an mehreren Stellen wegen möglicher Laufzeitfehler davon abgeraten wird. Siehe "Mkspecs anpassen" im Abschnitt "Weiteren Build erstellen".
Weiterhin habe ich versucht sämtliche Module auszuklammern, die nicht für die GUI-Entwicklung benötigt werden. Sodass am Ende ein schlanker Build steht, der nur für die GUI-Programmierung genutzt werden kann. Probleme, die beim Build von Modulen auftreten die ich weggelassen habe, können daher hier nicht behandelt werden.

Anmerkung: Wenn im Text Pfade zur besseren Lesbarkeit abgekürzt werden(%QTBINPACKAGE%, %QTSRC% etc.), heißt das nicht, dass diese als Umgebungsvariablen verfügbar sind und müssen bei der Eingabe der Befehle natürlich mit den korreten Pfaden ersetzt werden.



Installation von Qt (und VS-Addin)


Gut, wer das nicht allein hinbekommt, der sollte vielleicht lieber vom programmieren Abstand nehmen :p
Nee Spaß, aber hier lauern eigentlich keine großen Fallstricke.

  1. Passendes Package und VS-Addin(falls gewünscht) downloaden. Addin unter "other Downloads" ganz unten zu finden.
    HINWEIS: Das Addin funktioniert nicht mit der Express Version vom VS.
    http://qt-project.org/downloads
    Bei mir:
    "Qt 5.2.0 for Windows 32-bit (VS 2012)"
    "Visual Studio Add-in 1.2.2 for Qt5"​
  2. Qt installieren (Installationsverzeichnis zukünftig %QTBINPACKAGE% genannt)
  3. Qt VS-Addin installieren
    • Im VS unter Tools->Optionen->Umgebung->Add-in Sicherheit den Pfad hinzufügen, wo die *.AddIn Datei zu finden ist. Diese Liegt im Installationsverzeichnis(%ADDININSTALL%) des Addins in einem Ordner, der die Versionsnummer des VS angibt(beachte: 2008 ist 9.0, 2010 ist 10.0 und 2012 ist 11.0).
      Bei mir also:
      [src=text]%ADDININSTALL%\11.0[/src]
    • Dann unter Tools->Add-in Manager Häkchen rein und VS neustarten
    • Es sollte dann ein zusätzlicher Menüpunkt QT5 erscheinen
      HINWEIS: Ach wenn der Menüpunkt vielleicht auch so erscheint: VS muss als Admin gestartet werden, damit das Addin richtig funktioniert.

Unter
[src=text]%QTBINPACKAGE%\5.2.0\msvc2012[/src]
befindet sich nach der Installation der vorkompilierte Build, der beim binary Package dabei ist. Soweit ich weiß ist das eine shared, debug and release Version mit allen Figuckchen.
Die Version sollte im QtCreator automatisch erkannt werden und man täte gut daran, jetzt mal zum Test eine Standard-Anwendung mit dem Wizard zu erstellen. Im VS Addin muss die Qt-Version noch manuell hinzugefügt werden, siehe weiter unten im Abschnitt "Hinzufügen der Qt-Version zu Qt-Creator und VS2012(mit Qt Addin)".

Man muss natürlich nicht die oben genannten Installationen vornehmen und kann von Anfang an selbst kompilieren. Wer es ganz hart mag kann sogar das VS-Addin selbst kompilieren :D (siehe hier). Aber so hat man wie gesagt schonmal eine Version mit allen Features, mit der man entwickeln kann.
Bei der weiteren Beschreibung beziehe ich mich darauf, dass die Installation des binary Packages von Qt vorgenommen wurde.



Weiteren Build erstellen


Benötigte Programme und Tools siehe:
http://qt-project.org/wiki/Building_Qt_5_from_Git
http://qt-project.org/wiki/Building_Qt_Desktop_for_Windows_with_MSVC
http://qt-project.org/doc/qt-5.0/qtdoc/requirements-win.html

Anmerkung: Ein Windows SDK o.ä. habe ich nie installiert, scheint aber so, dass es seit VS2012 mit installiert wird. Ich nutze VS2012 Ultimate und musste jedenfalls nichts dergleichen installieren.

meine Build Umgebung:
  • ActivePerl 5.16
  • Python 3.3
  • VS2012 Ultimate
Ruby ist angeblich nur für einen Build mit Webkit nötig. Kann allerdings nicht sagen, ob ruby auch so benötigt wird, weil ich es so oder so schon drauf hatte.
Irgendwo stand Python auch nur bei Webkit unter den vorraussetzungen, aber hier kann ich sagen, dass Python definitiv benötigt wird, denn beim ersten Versuch ohne brach er mit einem Fehler ab.

Für Webkit und ANGLE weiterhin notwendig:
  • Bison
  • GPerf
  • Flex
Sind aber bei den Sourcedateien aber mit dabei, evtl. muss nur die %PATH% Umgebungsvariable entsprechend gesetzt werden, aber wie es aussieht geschieht das automatisch.


So nun zur Sache: Ziel der Anleitung ist ein sog. shadow build. Das heißt, die Erzeugten Dateien landen in einem Anderen Verzeichnis als die Quelldateien. Das src-Verzeichnis bleibt so sauber und kann für mehrere verschiedene Builds genutzt werden.
Im Anschluss an den Buildvorgang muss der Build aber noch installiert werden und landet dann sozusagen an seinem entgültigen Bestimmungsort.
Wir haben also 3 Verzeichnisse, die ich wie folgt bezeichnen werde:
  • %QTSRC% ein src-Verzeichnis mit den Quelldateien
  • %QTBUILD% ein Build-Verzeichnis, in dem die Dateien landen, die während des Buildvorganges erzeugt werden
  • %QTPREFIX% ein Verzeichnis, in dem der Build abschließend installiert wird und von dem aus er dann schlussendlich verwendet wird

Und so beginnt es also...

  1. download source
    http://qt-project.org/downloads
    Link zum zip oder tar ist in dem kurzen Fließtext unter den ganzen Downloadlinks versteckt.
  2. unzip to [src=text]%QTBINPACKAGE%\5.2.0\[/src]
    Bei mir z.B.:
    [src=text]%QTBINPACKAGE%\5.2.0\qt-everywhere-opensource-src-5.2.0[/src] (künftig als %QTSRC% bezeichnet)
  3. Mkspecs anpassen
    • in [src=text]%QTSRC%\qtbase\mkspecs\[/src] passenden Ordner suchen
      Bei mir:
      [src=text]\win32-msvc2012[/src]
    • dort die qmake.conf entsprechend bearbeiten:
      ich habe z.B. in den Zeilen
      [src=text]QMAKE_CFLAGS_RELEASE = -O2 -MD
      QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi[/src]
      die Option -O2(maximize Speed) in -O1(minimize size) geändert
      Ändert man hier -MD in -MT, dann wird auch die MSVC Runtime statisch gelinkt. Davon wird aber auf mehreren Seiten in Verbindung mit Qt abgeraten.
      Hinweis: Die Option -MT habe ich nicht ausprobiert. Mein build ist -MD gelinkt, ist also noch von den MSVC-Runtime-DLL's abhängig.
      Für weitere Optionen siehe: http://msdn.microsoft.com/en-us/library/fwkeyyhe.aspx
  4. Build kofigurieren
    • Developer Eingabeaufforderung starten
      (Start > Alle Programme > Microsoft Visual Studio 2012 > Visual Studio Tools > Developer-Eingabeaufforderung für VS2012)
    • Umgebungsvariablen
      • binary-Verzeichnis des Buildordners zur PATH-Umgebungsvariable hinzufügen
        [src=text]set PATH=%QTBUILD%\bin;%PATH%[/src]
      • Die Verzeichnisse von Perl und Python müssen in der Umgebungsvariable %PATH% enthalten sein, damit sie korrekt aufgerufen werden können.
        Man überprüfe das mit
        [src=text]echo %PATH%[/src]
        Hier müssen die Ordner mit enthalten sein, die python.exe(bei mir direkt im Installationsverzeichnis von Python) und perl.exe(bei mir im Perl-Installatinsverzeichni im Ordner \bin)
        Wenn nicht, dann mit set PATH hinzufügen
    • Übersicht über mögliche Konfigurationsparameter
      [src=text]%QTSRC%\configure -help > options.txt[/src]
      Hilft, sich einen Überblick zu verschaffen.
      Weitere Infos unten, im Abschnitt "Hinweise zur Build-Konfiguration" und hier
      Vorsicht: "configure" nicht mit anderen Parametern als -help aufrufen, wenn man sich noch im src-Verzeichnis befindet. Dies würde die Konfigurationsprozedur im src-Ordner starten und der Build würde dann dort landen.
    • configure.bat aufrufen
      Um einen shadow build auszuführen, muss man "configure" von dem Ordner aufrufen, indem dann der build landen soll(%QTBUILD%). So bleibt das src-Verzeichnes sauber für weitere Builds. Allerdings muss der src-Ordner und der Ziel-Ordner auf einer Ebene liegen.
      Also z.B. [...]Qt5.2.0\qt-src als src-Ordner und [...]Qt5.2.0\qt-build als Ziel.
      Weiterhin kann man noch einen Ordner angeben, in den der Build dann entgültig installiert werden soll. Dieser wird dem configure-Befehl mit dem Schalter -prefix mitgeteilt.
      Bei mir:
      [src=text]%QTBINPACKAGE%\5.2.0\qt-everywhere-opensource-src-5.2.0[/src] als src-Verzeichnis (%QTSRC%)
      [src=text]%QTBINPACKAGE%\5.2.0\msvc2012_stat_md_build[/src] als Zielordner für den Build (%QTBUILD%)
      [src=text]%QTBINPACKAGE%\5.2.0\msvc2012_stat_md_min_gui_only[/src] als Installationsordner für den Build (%QTPREFIX%)
    • zum build Ordner navigieren
      [src=text]cd %QTBUILD%[/src]
    • von dort aus "configure" mit entsprechenden Optionen aufrufen
      Bei mir ist es dieser Bandwurm:
      [src=text]%QTSRC%\configure -prefix %QTPREFIX% -release -static -opensource -platform win32-msvc2012 -mp -opengl es2 -angle -nomake examples -nomake tools -no-openssl -no-audio-backend -no-wmf-backend -no-sql-sqlite -skip qtactiveqt -skip qtandroidextras -skip qtconnectivity -skip qtimageformats -skip qtlocation -skip qtmultimedia -skip qtquick1 -skip qtsensors -skip qtwebkit -skip qtwebkit-examples -skip qtxmlpatterns[/src]
      Mit -prefix wird festgelegt, in wlches Verzeichnis der Build dann schlussendlich installiert werden soll.
      Normalerweise wird man dann noch gefragt, ob opensource oder commercial, was aber mit der Option -opensource unterdrückt wird.
      Danach noch die license mit 'y' akzeptieren(natürlich nur, wenn man einverstanden ist ;)) und ab dafür.
      Bei mir war diese Prozedur nach 5-10min erledigt.
      Hinweis: die Option -ltcg erzeugt sehr große(wirklich groß!) .lib's, außerdem braucht der Linker ewig um später ein Projekt zu linken. Die am Ende erstellten Executables sind aber kleiner. Siehe auch "Hinweise zur Build-Konfiguration"
      Achtung: mit der Option -static darf man aus Lizenzgründen nur opensource veröffentlichen
  5. Build ausführen
    [src=text]nmake[/src]
    Ich habe noch "> build.log" an den Befehl angehangen. So hat man später nochmal die möglichkeit, sich die Ausgaben des Buildvorgangs anzuschauen. Allerdings sieht man nichts mehr "live" in der Konsole.
    Nach einer Ewigkeit ist dann der eigentliche Build(hoffentlich ohne Fehler) abgeschlossen.
    Der Build landet im Verzeichnis %QTBUILD%, von welchem der configure-Befehl aufgerufen wurde.
  6. Build installieren
    [src=text]nmake install[/src]
    Auch hier habe ich wieder "> install.log" angehangen.
    Der Build muss nun noch installiert werden, was auch nochmal ein weilchen dauert...
    Kopiert alle nötigen Dateien und erstellt die erforderliche Verzeichnisstruktur in %QTPREFIX%

Damit wäre der Buildvorgang abgeschlossen und alle nötigen Dateien sollten im Ordner %QTPREFIX% liegen und rein theoretisch könnte der %QTBUILD% Ordner nun gelöscht werden.
ABER: Die Installationsroutinen sind alles Andere als perfekt, zumindest für Windows, was ich so gelesen habe. Um einen Rebuild zu vermeiden(ja, es ist mir passiert und es war sehr ärgerlich) habe ich den Ordner %QTBUILD% zunächst noch nicht gelöscht, sondern erstmal nur verschoben/umbenannt. Dies ist aber erforderlich, damit sich evtl. Verweise auf falsche Pfade oder fehlende Dateien zeigen.
Es gibt bei dem Installationsprozess einige Waisenkinder, die zurück bleiben - was dann zu Fehlern führt. Siehe "Fehlermeldungen/Probleme bei der Verwendung des Builds" weiter unten.

Damit der Build auch verwendet werden kann, um statisch gelinkte Projekte zu erzeugen, muss man dem QtCreator(oder dem VS, wenn man das Addin installiert hat) noch mitteilen, das dieser Build existiert. Dazu siehe Abschnitt "Hinzufügen des Builds zu Qt-Creator und VS2012(mit Qt Addin)"



Buildprobleme


In einigen Foren wird berichtet, das ein Bug in der Avast-Sandbox den Build mit einer Fehlermeldung enden lässt, auch wenn Avast deaktiviert ist, nur Deinstallation soll helfen. Nach dem Build kann Avast dann angeblich wieder installiert werden. siehe z.B. hier
Ich verwende Avast, Programmversion 2014.9.0.2011. Habe vor dem Build folgendes gemacht:
Rechtsklick auf das Trayicon > avast! Schutzsteuerung > bis zum nächsten Neustart deaktivieren
Außerdem hab ich noch Comodo's Defense+ ausgeschaltet. Kein einziges Mal brach der Build wegen einem Fehler ab. Avast scheint den Bug mittlerweile behoben zu haben.
Anyway, wenn der Build mit einem Fehler abbricht, könnte das Virenprogramm o.ä. dran schuld sein.


Beim Build direkt hatte ich wie gesagt keine Fehler, nur Warnungen(Auswirkungen und Herkunft noch nicht untersucht, aber bisher keine negativen einflüsse festgestellt).
Falls es jemand interessiert:
[src=tesxt]
--------------------------
build.log
--------------------------


configure mit Option -ltcg
--------------------------
108 warnings total:
37 warning C4996:
33 'xxxxx': This function or variable may be unsafe. Consider using xxxxx_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
4 'xxxxx': wurde als veraltet deklariert
21 warning C4718: 'std::_Tree<std::_Tmap_traits<enum TBasicType,enum TPrecision,std::less<enum TBasicType>,pool_allocator<std::pair<enum TBasicType const ,enum TPrecision> >,0> >::_Erase': Rekursiver Aufruf besitzt keine Nebeneffekte, wird gelöscht
17 warning C4530: C++-Handler verwendet, aber Entladesemantik ist nicht aktiviert. Geben Sie /EHsc an.
13 warning C4129: 'X': Nicht erkannte Folge von Escapesequenz
6 warning C4146: Einem vorzeichenlosen Typ wurde ein un„rer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
5 warning C4995: 'xxxxx': der Name, der als #pragma markiert war, wurde verworfen
4 warning C4018:
2 '>': Konflikt zwischen 'signed' und 'unsigned'
2 '<': Konflikt zwischen 'signed' und 'unsigned'
3 warning C4345: Verhaltens„nderung: Ein Objekt des POD-Typs, der mit der Initialisierung des Formulars '()' erstellt wurde, wird mit 'default' initialisiert
2 warning C4100: 'xxxxx': Unreferenzierter formaler Parameter


Build ohne Option -ltcg
--------------------------
89 warnings total:
37 warning C4996:
33 'xxxxx': This function or variable may be unsafe. Consider using xxxxx_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
4 'xxxxx': wurde als veraltet deklariert
2 warning C4718: 'std::_Tree<std::_Tmap_traits<enum TBasicType,enum TPrecision,std::less<enum TBasicType>,pool_allocator<std::pair<enum TBasicType const ,enum TPrecision> >,0> >::_Erase': Rekursiver Aufruf besitzt keine Nebeneffekte, wird gelöscht
17 warning C4530: C++-Handler verwendet, aber Entladesemantik ist nicht aktiviert. Geben Sie /EHsc an.
13 warning C4129: 'X': Nicht erkannte Folge von Escapesequenz
6 warning C4146: Einem vorzeichenlosen Typ wurde ein un„rer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
5 warning C4995: 'xxxxx': der Name, der als #pragma markiert war, wurde verworfen
4 warning C4018:
2 '>': Konflikt zwischen 'signed' und 'unsigned'
2 '<': Konflikt zwischen 'signed' und 'unsigned'
3 warning C4345: Verhaltens„nderung: Ein Objekt des POD-Typs, der mit der Initialisierung des Formulars '()' erstellt wurde, wird mit 'default' initialisiert
2 warning C4100: 'xxxxx': Unreferenzierter formaler Parameter
[/src]



Hinweise zur Build-Konfiguration


  • Die Option -ltcg steht für Linktime Code Generation und führt dazu, das der Programmcode optimiert wird und so die Executables kleiner werden.
    Allerdings gibt es auch eine Kehrseite der Medallie: Der Linkvorgang dauert später sehr lange, da ja Optimierungen vom Linker vorgenommen werden. Ich hatte auch den Eindruck, das sich die Buildzeit für Qt an sich verlängert. Habe da aber jetzt nicht mit der Stoppuhr daneben gesessen, da der Build sowieso ziemlich lange dauert.
    Auch sei erwähnt, dass die Lib's um ein vielfaches größer werden. Mein %QTBUILD% wurde 10,3GB groß und %QTPREFIX% 4,93GB. Gegenüber 991MB und 371MB ohne -ltcg.
    -ltcg:
    qtbuild_ltcg.png qtprefix_ltcg.png

    ohne -ltcg
    qtbuild_no_ltcg.png qtprefix_no_ltcg.png

    Woran das liegt und wie der Linker das macht würde hier den Rahmen sprengen.
    Wie groß die Einsparung durch die Optimierung ist, kann ich noch nicht sagen. Beim standard wizard-generierten Projekt mit einem leeren Fenster war der Größenunterschied kaum merkbar. Liegt aber daran, das der Linker auch nur was optimieren kann, wenn auch genügend Einsparpotential da ist, sprich: mehr Quellcode. Bei den paar Zeilen vom Standardprojekt lässt sich nicht viel rausholen...
    app_ltcg.png app_no_ltcg.png
  • Mit der config Option -skip qtquick1 ist nur QtQuick 2.0 oder QtQuick Controls 1.0 verwendbar. Im Qt Creator sind alle Versionen zur Auswahl, Verwendung von QtQuick 1 aber nicht möglich.
    QtQuick benötigt auch OpenGL(oder eben ANGLE), funktioniert also nicht mit der Option -no-opengl. Beim Build gibts scheinbar keine Probleme, aber es funktioniert hinterher nicht.



Hinzufügen des Builds zu Qt-Creator und VS2012(mit Qt Addin)


Hinzufügen der Qt-Version zum Creator
Das Hinzufügen eines weiteren Builds zu QtCreator ist ein 2-stufiger Prozess.
  1. Zunächst fügt man eine neue QtVersion hinzu:
    http://qt-project.org/doc/qtcreator-2.6/creator-project-qmake.html
  2. danach fügt man die eben erstellte QtVersion einem sog. Kit hinzu:
    http://qt-project.org/doc/qtcreator-2.6/creator-targets.html

Probleme:
Wenn man die Qt-Version im Creator hinzugefügt hat werden möglicherweise Warnungen angezeigt:
qt_creator_warnings.png

  • "Die ABI konnte nicht bestimmt werden. Stellen Sie sicher, dass Sie einen passenden Compiler zum Erstellen verwenden."
    Durch einen Bug im Creator werden statische Bibliotheken nicht korrekt erkannt.
    Abhilfe:
    As a workaround you can copy a QtCore*.dll matching your compiler and architecture next to libQtCore.a. That one will be picked up first and make the ABI detection succeed. The Qt SDK should have a matching QtCore dll somewhere.
    Also wenn man das binary Package installiert hat findet man im mitgelieferten Build die passende dll:
    [src=text]%QTBINPACKAGE%\5.2.0\msvc2012\bin\Qt5Core.dll[/src]
    kopieren nach
    [src=text]%QTPREFIX\lib[/src]
    Die Warnung sollte danach verschwinden. Wobei ich auch mit Warnung bisher keine Probleme gehabt habe.
  • "Es ist kein qmlviewer installiert."
    Bisher keine Möglichkeit gefunden, die Warnung zu beseitigen.


Hinzufügen der Qt-Version zum VS-Addin:
  1. QT5 -> Qt Optionen
  2. Im Reiter "QT Versionen" auf "Hinzufügen" und zu dem Ordner navigieren, in dem der Build installiert wurde(%QTPREFIX%)
  3. Optional Versionsname ändern, dann OK -> OK

Standardversion
Da diese Buildversion keine Debug-Informationen zur verfügung stellt eignet sie sich nicht für die Entwicklung. Typischerweise wird man das Projekt also mit einer anderen Version entwickeln. Hierbei ist darauf zu achten, dass in der Version für die Entwicklung möglicherweise mehr Features verfügbar sind, die dann nicht mehr mit dem statischen minimal Build kompiliert und gelinkt werden können.

Im VS wird immer die eingestellte Standardversion(Unter QT5 -> Qt Optionen -> Auswahlfeld Standard Qt/Win Version unten) für neue Projekte verwendet. Als Standardversion nimmt man am besten den Build, der beim binary Package dabei ist, man muss nur aufpassen, das man keine Funktionen verwendet, die der static Build später nicht unterstützt. Denn man kann man beim Anlegen eines neuen Projekts Haken setzen, welche Funktionen man ins Projekt einbinden will, aber hier werden natürlich immer die Funktionen angezeigt, die in der Standardversion verfügbar sind.
Ist die Entwicklung abgeschlossen, kann man zur release Version wechseln: In Projektmappen-Explorer Rechtsklick auf die Projektmappe -> Projektmappen Qt Version ändern. Mit Rechtsklick auf das Projekt -> Qt Projekteinstellungen hat man im Tab Qt Module dann noch einen überblick, welche Module vom gewählten Build unterstützt werden. Die hier eingestellte Qt version wir wieder überschrieben, sobald man die Qt Projektmappen Version ändert.
Hinweis: Nicht vergessen, auf release umzustellen, sonst sucht der Linker nach den nicht vorhandenen Debug-Libs

Im QtCreator kann man schon beim Anlegen eines neuen Projekts die Kits(und damit die Qt-Versionen) bestimmen, die verwendet werden sollen. Bei dem Kit vom static-Build aber am besten gleich den Haken bei Debug raus nehmen, um garnicht in Versuchung zu geraten, wir haben ja einen reinen Release Build.
Später kann man dann unten links über der "Ausführen" Schaltfläche einfach zum gewünschten Build wechseln. Unter "Projekte" kann man auch nachträglich noch Kits hinzufügen.



Fehlermeldungen/Probleme bei der Verwendung des Builds


  • [src=text]:-1: Fehler: LNK1181: Eingabedatei "%QTPREFIX%/lib/translator_common.lib" kann nicht geöffnet werden.
    :-1: Fehler: LNK1181: Eingabedatei "%QTPREFIX%/lib/translator_hlsl.lib" kann nicht geöffnet werden.
    :-1: Fehler: LNK1181: Eingabedatei "%QTPREFIX%/lib/preprocessor.lib" kann nicht geöffnet werden.[/src]
    Unter Windows wird ANGLE verwendet(wenn configure nicht mit -opengl desktop oder -no-opengl aufgerufen wurde), um OpenGL-Aufrufe in DirectX Aufrufe zu übersetzen. Eine Version der ANGLE-Library liegt Qt bei und wird mit kompiliert, sofern man nicht die Option -opengl desktop oder -no-opengl verwendet.
    Bei mir wurden die Libs zwar erstellt, aber bei nmake install nicht mit kopiert. Das führte dann dazu, das der Linker sich über fehlende Dateien beschwert hat.
    Führte bei mir zu diesen Fehlermeldungen(im Qt-Creator)

    Das Problem konnte ich dadurch beheben, dass ich die Dateien manuell aus %QTBUILD% ins Lib-Verzeichnis in %QTPREFIX% kopiert habe:
    (Die zugehörigen *.prl sind ebenfalls notwendig. Die Debugversionen mit angehängtem 'd' brauchen wir nicht, da das ein reiner release Build ist)
    [src=text]%QTBUILD%\qtbase\lib\preprocessor.lib
    %QTBUILD%\qtbase\lib\preprocessor.prl
    %QTBUILD%\qtbase\lib\translator_common.lib
    %QTBUILD%\qtbase\lib\translator_common.prl
    %QTBUILD%\qtbase\lib\translator_hlsl.lib
    %QTBUILD%\qtbase\lib\translator_hlsl.prl[/src]
    Kopieren nach
    [src=text]%QTPREFIX%\lib[/src]

    In den Makefiles sind keine Installationsbefehle, warum weiß ich nicht. Wenn jmd. mit mehr Ahnung mal dazu kommt, die Makefiles dazu liegen nach dem Build in
    [src=text]%QTBUILD%\qtbase\src\angle\src\compiler\[/src]
    die Projectfiles dann am selben Platz im %QTSRC% Verzeichnis
  • [src=text]:-1: Fehler: LNK1181: Eingabedatei "%QTBUILD%\qtbase\lib\Qt5PlatformSupport.lib" kann nicht geöffnet werden.[/src]
    qmqke erzeugt falsche lib-Verzeichnisse im Makefile.
    Ich weiß nicht woran es liegt, aber der Befehl nmake install scheint nicht richtig zu funktionieren. In manchen *.prl Scripts werden die Pfade für die *.lib Dateien nicht korrekt an das %QTPREFIX% Verzeichnis angepasst. Das führt dann dazu, dass die falschen Pfade im Makefile landen und sich der Linbker über fehlende Libs beklagt, obwohl sie im \lib Ordner vorhanden sind.
    In den Perl-Scripts müssen die Pfade in folgender Zeile entsprechend angepasst werden:
    [src=text]QMAKE_PRL_LIBS =[/src]
    zeigen die Pfade auf falsches Lib-Verzeichnis im %QTBUILD% Ordner, statt auf eines in %QTPREFIX%
    Der Fehler verschwand, als ich die Pfade so angepasst hatte, dass sie auf %QTPREFIX%\lib bzw. auf die jeweiligen Dateien in diesem Ordner zeigen.
    obige Fehlermeldung kam durch die Datei
    [src=text]%QTPREFIX%\plugins\platforms\qwindows.prl[/src]
    Weitere Fehlermeldungen dieser Art waren:
    [src=text]:-1: Fehler: LNK1181: Eingabedatei "D:\development\Qt5.2.0\5.2.0\msvc2012_stat_build\qtbase\lib\libGLESv2.lib" kann nicht geöffnet werden.
    :-1: Fehler: LNK1181: Eingabedatei "D:/development/Qt5.2.0/5.2.0/msvc2012_stat_build/qtbase/lib/translator_common.lib" kann nicht geöffnet werden.
    :-1: Fehler: LNK1181: Eingabedatei "D:/development/Qt5.2.0/5.2.0/msvc2012_stat_build/qtbase/lib/translator_hlsl.lib" kann nicht geöffnet werden.
    :-1: Fehler: LNK1181: Eingabedatei "D:/development/Qt5.2.0/5.2.0/msvc2012_stat_build/qtbase/lib/preprocessor.lib" kann nicht geöffnet werden.[/src]
    Als verantwortliche Dateien stellten sich diese heraus:
    [src=text]%QTPREFIX%\libEGL.prl
    %QTPREFIX%\libGLESv2.prl[/src]

    Nach diesen Ersetzungen war es dann endlich so weit: Ich konnte die erste Qt-Widgets-Anwendung mit dem Qt-Creator erfolgreich erstellen. Eine *.exe, 6 einhalb MB, keine Qt-dll's benötigt, paff.


    Genauere Untersuchung brachte zu Tage, dass nochmehr Perl-Scripte betroffen sind(der Rest im \lib-Ordner scheint i.O. zu sein)
    Bei mir waren es:
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\accessible\qtaccessiblequick.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\accessible\qtaccessiblewidgets.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\bearer\qgenericbearer.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\bearer\qnativewifibearer.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\iconengines\qsvgicon.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\imageformats\qico.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\imageformats\qsvg.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\platforms\qminimal.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\platforms\qoffscreen.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\platforms\qwindows.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\printsupport\windowsprintersupport.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\qmltooling\qmldbg_qtquick2.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\plugins\qmltooling\qmldbg_tcp.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQml\Models.2\modelsplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick.2\qtquick2plugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Controls\qtquickcontrolsplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Dialogs\Private\dialogsprivateplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Dialogs\dialogplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Layouts\qquicklayoutsplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\LocalStorage\qmllocalstorageplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Particles.2\particlesplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\PrivateWidgets\widgetsplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtQuick\Window.2\windowplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtTest\qmltestplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\QtWinExtras\qml_winextras.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\Qt\labs\folderlistmodel\qmlfolderlistmodelplugin.prl
    D:\development\Qt5.2.0\5.2.0\msvc2012_stat_md_min_gui_only\qml\Qt\labs\settings\qmlsettingsplugin.prl
    Wann immer es eine Meldung über ne fehlende *.lib gibt, diese aber vorhanden ist, wird mit hoher Wahrscheinlichkeit so ein fehlerhaftes Skript dafür verantwortlich sein.
    Achtung: Es liegen nicht zwingend alle *.lib's im Ordner %QTPREFIX%\lib

    Bisher habe ich noch keine zufriedenstellende Lösung für das Problem gefunden, außer manuell nachzuschauen, wenn ein Fehler auftritt. Wenn jemand eine Idee hat, her damit. Vielleicht besteht das Problem in der nächsten Version von Qt nicht mehr.
  • Wenn ich eine QtQuick-Anwendung oder QtQuick UI(im QtCreator) mit meinem Build kompilieren will, kommt es schon beim Wechsel zum entsprechenden Kit zu einem Fehler:
    Erst öffnet sich ein Fenster "qmlimportscanner.exe funktioniert nicht mehr"
    qmlimportscanner_error.png
    wenn man das mit "Programm schließen" bestätigt, zeigt der qtCreator den Fehler:
    [src=text]Project ERROR: Failed to parse qmlimportscanner output.[/src]
    Starte ich die qmlimportscanner.exe manuell von der Komanndozeile mit entsprechenden Parametern, funktioniert se aber und ich bekomme eine Ausgabe von qmlinportscanner.exe. Ich weiß nicht, warum die exe abschmiert, wenn sie der Creator aufruft...



Weitere Infos/Quellen


Build:
http://qt-project.org/wiki/Building_Qt_5_from_Git
http://qt-project.org/wiki/Building_Qt_Desktop_for_Windows_with_MSVC
http://qt-project.org/doc/qt-5.0/qtdoc/requirements-win.html
http://qt-project.org/doc/qt-5/configure-options.html
http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/comment-page-1/
http://www.npcglib.org/~stathis/blog/2011/03/06/qt-shadow-build-with-visual-studio/
https://qt-project.org/doc/qt-5.0/qtdoc/shadow.html
http://stackoverflow.com/questions/...-2012-visual-studio-2013-and-integrating-with
http://qt-project.org/wiki/Qt_Library_Cross_Dependencies

Deploy/Release:
http://qt-project.org/doc/qt-5/deployment.html
http://qt-project.org/doc/qt-4.8/deployment-windows.html
http://www.formortals.com/how-to-statically-link-qt-4/

Issues/Errors:
http://qt-project.org/forums/viewthread/5663
https://bugreports.qt-project.org/browse/QTCREATORBUG-4771
http://askubuntu.com/questions/2361...led-while-trying-to-run-currencyconverter-exa
http://stackoverflow.com/questions/...attempting-to-build-qt-on-windows-7-32-bit-bu
 
Oben