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.
Antworten
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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: 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: 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.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf »

Nimm Dir mal den DependencyWalker und guck, wer die Runtime-DLLs verlangt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

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
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

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

Beitrag von Thoran »

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
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf »

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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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: 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.
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

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

Beitrag von Thoran »

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
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

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
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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: 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: 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: 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

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
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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:
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

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
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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 ;)
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

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

Beitrag von Thoran »

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
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

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

Beitrag von INe5xIlium(Freak5) »

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.
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

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

Beitrag von Thoran »

Falls es jemanden interessiert, wie ich meine Qt-Bibliothek gebaut habe, dann kann dazu jetzt ein Artikel auf meinem Blog meiner Webseite gelesen werden.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Antworten