Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.

Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Beitragvon INe5xIlium(Freak5) » 10.05.2017, 17:44

Hallo,
ich habe mit dem VisualStudio 2015 QT5.8 versucht statisch zu compilieren. Zuerst mit dynamisch gelinkter Visual studio Redistributable und später mit statisch gelinkter.
Code: Ansicht erweitern :: Alles auswählen
configure -prefix /testqt5.8dynRT -static -opengl desktop -no-openssl -opensource -confirm-license -skip qtwebkit -release

configure -prefix /testqt5.8statRT -static -static-runtime -opengl desktop -no-openssl -opensource -confirm-license -skip qtwebkit -release

Ich musste dazu natürlich \MD auf \MT schalten und die Datei wurde ein wenig größer. Das ist jedoch der einzige Unterschied. Trotz " -static -static-runtime" verlangt die produzierte Exe-Datei nach den Runtime-DLLs.

Ich habe das Problem schon im qtforum hier gepostet. Dann hat Thoran aber geschrieben, dass er Ahnung davon hat und hier im Forum erwarte ich zumindest tipps, wie ich die Datei vielleicht auseinandernehmen kann, um herauszufinden wo die DLL genau benötigt wird. Bisher kenne ich nur den Dependency Walker. der sagt mir (soweit ich weiß) aber nur, dass sie benötigt wird. Und diese Erkenntnis hat mir eine Win7 Virtual Machine auch schon geliefert.

Woran kann das liegen? Irgendwas muss sich ja geändert haben, dass ich den Schalter zum Compilen ändern musste. Aber wie kann es sein, dass noch die DLLs benötigt werden?

P.S.: Was ich mich auch frage gerade beim "static -static-runtime" ging das übersetzen im make Prozess ziemlich schnell. Dafür hat "jom install" ewig gedauert und im Hintergrund den Compiler mehrfach aufgerufen. Ich dachte, da muss am Ende nur noch kopiert werden?

Edit: Ich bekomme außerdem diese Warnung, wenn ich die statische Runtime versuche zu nehmen:
Code: Ansicht erweitern :: Alles auswählen
1>LINK : warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
Zuletzt geändert von INe5xIlium(Freak5) am 12.05.2017, 14:12, insgesamt 1-mal geändert.
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Schrompf » 10.05.2017, 23:23

Nimm Dir mal den DependencyWalker und guck, wer die Runtime-DLLs verlangt.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3588
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Krishty » 10.05.2017, 23:33

INe5xIlium(Freak5) hat geschrieben:Bisher kenne ich nur den Dependency Walker. der sagt mir (soweit ich weiß) aber nur, dass sie benötigt wird. Und diese Erkenntnis hat mir eine Win7 Virtual Machine auch schon geliefert.
Ich schätze, er will wissen, welche der zahlreichen LIBs gegen die CRT gelinkt wurde. Aus dem Stehgreif fällt mir da auch nichts ein; sicher wird es in die Richtung von dumpbin gehen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5871
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Thoran » 11.05.2017, 10:52

P.S.: Was ich mich auch frage gerade beim "static -static-runtime" ging das übersetzen im make Prozess ziemlich schnell. Dafür hat "jom install" ewig gedauert und im Hintergrund den Compiler mehrfach aufgerufen. Ich dachte, da muss am Ende nur noch kopiert werden?

Wenn du Dein Qt 5.8 mit dem zweiten Aufruf rekonfiguriert hast, hat das nichts gebracht. Für sowas musst Du Deinen kompletten build-path (ich hoffe out-of-source) wegschmeißen und neu erzeugen. So stelle ich sicher, dass nicht noch Einstellungen vom vorherigen configure-Lauf übrig bleiben.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelles Projekt: "Arbeitsttitel AlphaOmega"
Spieleengine SilverCore
Benutzeravatar
Thoran
 
Beiträge: 171
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Schrompf » 11.05.2017, 12:11

Achja, sorry. Hab nicht genau gelesen, was Du geschrieben hast. Aber es sollte trotzdem mit dem DependencyWalker gehen. Der bietet auch eine Baum-Ansicht, die Du durchklappern kannst, um zu sehen, welches Modul die CRT noch dynamisch linkt.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3588
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon INe5xIlium(Freak5) » 11.05.2017, 14:05

Thoran hat geschrieben:Wenn du Dein Qt 5.8 mit dem zweiten Aufruf rekonfiguriert hast, hat das nichts gebracht. Für sowas musst Du Deinen kompletten build-path (ich hoffe out-of-source) wegschmeißen und neu erzeugen. So stelle ich sicher, dass nicht noch Einstellungen vom vorherigen configure-Lauf übrig bleiben.

Es sollte nur einen Aufruf an Configure gegeben haben. Aber es könnte natürlich sein, dass meine Quelle schon mal einen versehentlich hatte. Ich versuche es gleich mal mit einem frischen Source noch einmal. Und schaue mir den Dependency Walker auch noch wieder scharf an.

Edit: Ich muss da gleich noch ein mal drauf zurück kommen, muss jetzt aber weg. Dependency Walker sagt:
Code: Ansicht erweitern :: Alles auswählen

QT.exe
...WINMM.DLL
......NTDLL.DLL
......WINMMBASE.DLL
.........MCVCRT.DLL (Hier hat das Symbol davor einen Pfeil)
...

Es scheint nichts von QT da aufzutauchen, aber alles von QT sollte ja ohnehin statisch in meiner Exe sein, wie würde ich jetzt herausfinden, welche statische Bibliothek für die dynamischen Aufrufe verantwortlich ist?
Edit2:
DependencyWalker.PNG


Ich meine, ich kann dort sehen, dass es geladen wird, aber es kommt mehr oder weniger direkt aus der Exe.

P.S.: Aber es ist cool, dass man hier Anhänge verwenden kann. Dann bleibt der Beitrag auch noch in 10 Jahren lesbar :D

(Ich erstelle mir QT gerade neu. Bin bei 50% habe wirklich alles sauber gemacht, sogar nmake, statt jom verwendet. Natürlich ist die idc.exe schon wieder abgestürzt, aber das sollte ja nicht ändern ob etwas dynamisch oder statisch geladen wird)

Edit: Ich habe alles neu übersetzt, ist kein Unterschied. Wenn der da scheinbar nicht irgendwo das Datum unterbringen würde, wäre es wohl die gleiche Checksumme.
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Thoran » 12.05.2017, 09:45

Nur ne Frage am Rande: Hast du sichergestellt, dass alle Deine Dependencies von Qt auch ne statische RT haben? (Zlib, PCRE16, evtl. strawberry perl - keine Ahnung wie weit davon Objectcode in Qt gelinkt wird)
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelles Projekt: "Arbeitsttitel AlphaOmega"
Spieleengine SilverCore
Benutzeravatar
Thoran
 
Beiträge: 171
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Krishty » 12.05.2017, 10:05

Das ist ein Missverständnis. WinMM.dll ist Teil von Windows (der Multimedia-Layer) und referenziert die MSVCRT.DLL des Betriebssystems, nicht die MSVCRT<Version>.DLL deines Visual Studios. Die ist also kein Problem für dich, weil du auf jedem Windows eine fertig konfigurierte WinMM.dll mit allen Abhängigkeiten vorfinden wirst.

Zeig bitte mal alle direkten Abhängigkeiten (also nur die erste Generation Kinder im Baum) und falls da Drittbibliotheken wie zlib vorkommen, auch deren Kinder!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5871
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon INe5xIlium(Freak5) » 12.05.2017, 12:17

DependencyWalker.PNG
Da kommt die VCRuntime auch noch direkt vor auch in der Version, gegen die ich linke.

Aber QT habe ich mit dem configure String konfiguriert:
Code: Ansicht erweitern :: Alles auswählen
configure -prefix /testqt58statRT2 -static -static-runtime -opengl desktop -no-openssl -opensource -confirm-license -skip qtwebkit -release

Und im Projekt selber linke ich statisch mit "Laufzeitbibliothek: Multithreaded (/Mt)"

Kann das wieder mit dem Linkererror zu tun haben?
Code: Ansicht erweitern :: Alles auswählen
1>LINK : warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.


Edit:
Thoran hat geschrieben:Nur ne Frage am Rande: Hast du sichergestellt, dass alle Deine Dependencies von Qt auch ne statische RT haben? (Zlib, PCRE16, evtl. strawberry perl - keine Ahnung wie weit davon Objectcode in Qt gelinkt wird)

Nein. Ich dachte alles, was nicht direkt im SRC Folder liegt wird nur beim Build benutzt und nicht reincompiled. Strawberry perl habe ich tatsächlich installiert. Zlib eher nicht und PCRE16 erinnert mich daran, dass es so eine ähnliche lib gibt und ich die auch eingebunden hatte, aber die wurde im Prozess vom QT-Built erstellt, dachte ich. Ich meine "qtpcre.lib" ist tatsächlich da drin.
Ich lösche mal alle Libraries aus meinem Projekt, die ich nicht brauche, und schaue, was übrig bleibt. Aber qtpcre.lib wird tatsächlich benötigt. Ich hätte aber wirklich gedacht, dass die im QTbuild übersetzt wird und dann statisch linkt?

Momentan eingebunden ist das hier:
Code: Ansicht erweitern :: Alles auswählen
Dwmapi.lib
clip2tri.lib
imm32.lib
qtlibpng.lib
qtfreetype.lib
qtharfbuzz.lib
qtmain.lib
qtpcre.lib
qwindows.lib
UxTheme.lib
winmm.lib
Ws2_32.lib
Qt5AccessibilitySupport.lib
Qt5Core.lib
Qt5DataVisualization.lib
Qt5EventDispatcherSupport.lib
Qt5FontDatabaseSupport.lib
Qt5Gui.lib
Qt5Positioning.lib
Qt5ThemeSupport.lib
Qt5UiTools.lib
Qt5Widgets.lib
Zuletzt geändert von INe5xIlium(Freak5) am 12.05.2017, 12:47, insgesamt 1-mal geändert.
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon Krishty » 12.05.2017, 12:35

Ja; da wird irgendwo von einer statischen Abhängigkeit direkt die Visual C++-CRT genutzt und ja, die Linker-Warnung hat damit zu tun.

Du könntest mal versuchen, Link Library Dependencies in den Visual C++-Projekteinstellungen auf No zu setzen. Dann bekommen deine statischen Bibliotheken ihre Abhängigkeiten nicht mehr. Es wird sicher nicht mehr erfolgreich linken, aber aus den Fehlermeldungen kannst du vielleicht ablesen, welche Abhängigkeit schuld ist …

Nachtrag: Ich würde DUMPBIN /DIRECTIVES deine_statische_lib.lib ausprobieren, oder /DEPENDENTS, oder /IMPORTS … habe fast nie damit gearbeitet, aber vom Urin her müsste es das richtige Tool sein.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5871
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: QT5.8 -static -static-runtime benötigt dennoch VSC++ Run

Beitragvon INe5xIlium(Freak5) » 12.05.2017, 14:02

Ich glaube, es hat geholfen, aber anders.
Ich habe "Verknpfungsbibliotheksabhängigkeiten" deaktiviert, die Datei ist 100kb größer geworden und Dependency Walker findet keine VCRUNTIME Abhängigkeit mehr.
Jetzt läuft es auch unter fremden Windows Systemen, z.B. Windows 7. Das hat jetzt 4-5 Tage gedauert, bis das gelöst war und darauf, dass es so einen Schalter gibt, bin ich nicht gekommen.
Und es klingt so, als hättest selbst du nicht erwartet, dass er funktioniert :lol: .

Aber im Ernst... WARUM :shock:
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Beitragvon Krishty » 12.05.2017, 14:19

Ich würde sagen, Glück. Deine statischen Abhängigkeiten wurden für die VCRT-DLL kompiliert, müssen nun aber mit der statischen VCRT-Lib vorlieb nehmen und das Ganze kompiliert nur, weil die Namen zufällig identisch sind ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5871
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Beitragvon INe5xIlium(Freak5) » 13.05.2017, 12:22

Das erinnert mich daran, wie ich vor 11 Jahren die atl80.dll (oder ähnlich...) durch die atl.dll mit dem Hex-Editor getauscht habe. Statisch zu linken sorgt für mindestens 40% Größenersparnis und wenn ich UPX nehme, komme ich von ~20MB auf ~5MB.
Aber jetzt müsste ich schauen, wie ich das mit den Lizenzen hinbekomme, so dass es erlaubt ist. Als ich es beim letzten Mal gelesen hatte, klang es fast so, als müsste ich zu den Object Files meines Codes den Sourcecode von QT mitliefern und das macht die 15MB Größenersparnis locker zunichte ;)
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Beitragvon Thoran » 15.05.2017, 09:59

Meine Erfahrungen mit dem Qt5.8. statischem Build sind , dass man alle Dependencies und damit meine ich wirklich alles, was von Qt, seinen Dependencies und deren Dependencies irgendwie statisch gelinkt wird, auch in einer Form mit statischer RT vorliegen haben muss. Das war der Grund warum ich die statische RT verworfen habe. Es war mir einfach zu aufwendig PostgreSQL mit statischer RT zu bauen und dann noch von Hand die Verzeichnisse zusammenzubasteln, damit ich ein vernünftiges Layout zum Linken hatte.
Ich würde ja empfehlen, baue Qt statisch aber lass die RT dynamisch. Da sparst Du Dir wahrscheinlich Arbeit.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelles Projekt: "Arbeitsttitel AlphaOmega"
Spieleengine SilverCore
Benutzeravatar
Thoran
 
Beiträge: 171
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart

Re: Static QT benötigt dennoch VSC++ Runtime [fast gelöst]

Beitragvon INe5xIlium(Freak5) » 15.05.2017, 10:29

Naja, inzwischen läuft es ja. Ich weiß nicht genau warum (seit ich den Schalter, den Krishty erwähnt hat, umgelegt habe, kann ich da einstellen, was ich will, es funktioniert einfach).

Und insgesamt ist die statische .exe ~55% der Größe, die ich vorher mit allen DLLs hatte. Außerdem funktioniert jetzt upx, was vorher zu einem Fehler geführt hat, so dass ich das auf ~25-30% der Originalgröße drücken kann. Die .obj Dateien, die ich dann noch mitliefern muss machen mit Lizenz und allem <1Mb aus, das ist mehr als der Source, falls ich es Opensource machen würde, aber insgesamt immer noch weniger als dynamisch gelinkt.

Bei ernsthaften Programmen werde ich deinen Rat befolgen. Sobald die Programme etwas sinnvolles machen, stört sich wohl kaum jemand daran, wen eine .zip auf einmal 5MB größer ist. Installer mag ich aber immer noch nicht. Zu denen wird man im QT-Channel immer geraten mit einem Unterton, der so klingt, als wäre man nur dagegen, weil man sie selber nicht programmieren kann. Aber ich mag es nicht, wenn nicht essentielle Software etwas am System verändert. Auch bei Software wie Word oder MSVC++ mag ich es eigentlich nicht, wenn ich vorher einen Installer benötige, statt das Programm gleich zu starten. Diese Programme sind aber so wichtig, dass ich es über mich ergehen lasse.
Ich mag Programme wie FileZilla oder CpuZ, die man gleich aus dem Archiv heraus starten kann.
INe5xIlium(Freak5)
 
Beiträge: 32
Registriert: 29.07.2002, 11:43

Nächste

Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast