Seite 1 von 1

QT statisch linken (unresolved symbol) [gelöst!]

Verfasst: 09.05.2017, 12:23
von INe5xIlium(Freak5)
Hallo,
ich möchte ein QT-Programm statisch linken in Microsoft Visual C++ 64Bit. Dazu habe ich mir die QT-Bibliothek kompiliert. Die dynamische Version habe ich getestet und sie funkltioniert:

Code: Alles auswählen

configure -prefix /testqt5.8dyn -opengl desktop -no-openssl   -opensource  -confirm-license    -skip webkit   -release 
Der Webkit-Parameter war wahrscheinlich wirkungslos. Zum ausführen brauchte ich die Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll und im Ordner Platforms die qwindows.dll
Danach dann die statische Variante, aber mit danymischer runtime library, weil ich nicht alle Probleme auf einmal haben wollte:

Code: Alles auswählen

configure -prefix /testqt5.8dynRT  -static   -opengl desktop -no-openssl   -opensource  -confirm-license    -skip qtwebkit   -release 
Wenn ich jetzt ein Programm übersetze und starte, bekomme ich den Fehler:
This application failed to start because it could not find or load the QT platform plugin "windows" in "".

Reinstalling the application may fix this problem
Natürlich habe ich gesucht und gefunden, dass ich für statische Applikationen das hier brauche:

Code: Alles auswählen

#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Danach bekomme ich aber einen Linkerfehler:
1>------ Erstellen gestartet: Projekt: QtGui1Back5Static, Konfiguration: ReleaseStatic x64 ------
1> main.cpp
1> Bibliothek "C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\QtGui1Back5Static.lib" und Objekt "C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\QtGui1Back5Static.exp" werden erstellt.
1>qwindows.lib(qwindowswindow.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_DwmEnableBlurBehindWindow" in Funktion ""bool __cdecl applyBlurBehindWindow(struct HWND__ *)" (?applyBlurBehindWindow@@YA_NPEAUHWND__@@@Z)".
1>qwindows.lib(qwindowswindow.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_DwmIsCompositionEnabled" in Funktion ""bool __cdecl applyBlurBehindWindow(struct HWND__ *)" (?applyBlurBehindWindow@@YA_NPEAUHWND__@@@Z)".
1>C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\\QtGui1Back5Static.exe : fatal error LNK1120: 2 nicht aufgelöste Externe
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
Dabei habe ich schon fast alle .libraries verlinkt:
msvcrt.lib;clip2tri.lib;clipper.lib;imm32.lib;opengl32.lib;poly2tri.lib;qdirect2d.lib;qminimal.lib;qoffscreen.lib;qtpcre.lib;qtfreetype.lib;qtharfbuzz.lib;qtlibpng.lib;qtmain.lib;qwindows.lib;UxTheme.lib;winmm.lib;Ws2_32.lib;Qt5AccessibilitySupport.lib;Qt5Charts.lib;Qt5CLucene.lib;Qt5Concurrent.lib;Qt5Core.lib;Qt5DataVisualization.lib;Qt5DBus.lib;Qt5Designer.lib;Qt5DesignerComponents.lib;Qt5DeviceDiscoverySupport.lib;Qt5EventDispatcherSupport.lib;Qt5FbSupport.lib;Qt5FontDatabaseSupport.lib;Qt5Gamepad.lib;Qt5Gui.lib;Qt5Help.lib;Qt5Location.lib;Qt5Multimedia.lib;Qt5MultimediaQuick_p.lib;Qt5MultimediaWidgets.lib;Qt5Network.lib;Qt5NetworkAuth.lib;Qt5Nfc.lib;Qt5OpenGL.lib;Qt5OpenGLExtensions.lib;Qt5PacketProtocol.lib;Qt5PlatformCompositorSupport.lib;Qt5Positioning.lib;Qt5PrintSupport.lib;Qt5Purchasing.lib;Qt5Qml.lib;Qt5QmlDebug.lib;Qt5Quick.lib;Qt5QuickControls2.lib;Qt5QuickParticles.lib;Qt5QuickTemplates2.lib;Qt5QuickTest.lib;Qt5QuickWidgets.lib;Qt5Script.lib;Qt5ScriptTools.lib;Qt5Sql.lib;Qt5Scxml.lib;Qt5SerialBus.lib;Qt5SerialPort.lib;Qt5Sensors.lib;Qt5Svg.lib;Qt5Test.lib;Qt5TextToSpeech.lib;Qt5ThemeSupport.lib;Qt5UiTools.lib;Qt5Widgets.lib;Qt5WebChannel.lib;Qt5WebSockets.lib;Qt5WinExtras.lib;Qt5Xml.lib;Qt5XmlPatterns.lib;Qt53DCore.lib;%(AdditionalDependencies)
Im Internet (hier)finde ich immer etwas von einer "Qt5PlatformSupport.lib". Die finde ich bei mir nicht. Und die Qt5PlatformCompositorSupport.lib scheint nicht zu helfen.

Oder sollte ich mich dafür mal in einem QT-Forum registrieren? Die IRC-Channel sind auf alle Fälle nicht mehr hilfreich :/

Edit: http://www.qtforum.de/viewtopic.php?f=1&t=18386 (Edit: Hab den Beitrag mal gelöscht, was sollen die schon besseres schreiben :) )
Mal schauen, was da rauskommt :) Registriert seit 13 Minuten ^^

GELÖST
Krishty hat geschrieben:liegt doch in Dwmapi.lib … mal eingebunden? Windows SDK von Vista oder neuer benutzt (in alten SDK-Varianten existieren die Funktionen nicht)?
Danke Krishty!

Wenn ich so darüber nachdenke, habe ich wahrscheinlich die Funktion aus dem Einsprungspunkt nicht richtig kopiert, sonst hätte Google das ja auch finden müssen.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 12:40
von Schrompf
Ich hab das vor ein paar Jahren erprobt und bin ebenso gescheitert. Bei mir waren es damals andere Linkerfehler, aber das selbe Ergebnis. Tut mir leid.

Aber wenn Du's rausfindest, würde mich das sehr interessieren.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 12:51
von INe5xIlium(Freak5)
Hab mich mal im QT-Forum angemeldet, da kopiere ich es gleich mal rein, wenn es richtig statisch sein soll, muss ich so wie so nochmal für die -static-runtime übersetzen. Aber es hilft, wenn ich weiß, dass es tatsächlich ein hartes Problem ist. Die QT-Leute reagieren teilweise auch nicht so gut darauf, wenn man statisch linken will (Lizenzen und so).
Weil ich aber für eine kurze Demonstration keinen Installer haben möchte und >20Mb Applikationen für Dinge, die ich mit MSVC++2005 noch auf 8kb bekommen habe, schon etwas viel vorkommen, werde ich mir wohl mal auch fltk anschauen. Portabel sollte es schon sein und ich fand den Einstieg in QT sonst auch schön. Ich finde ein paar 100kb schon OK, aber wenn das Programm eigentlich nur eine kurze Technikdemonstration ist, dann würde ich statt einem Installer fast eher ein Video davon machen :D

P.S.: Wo sind meine ganzen Beiträge eigentlich hin? Ich hatte definitiv mal >2000. Das glaubt mir doch sonst auch keiner, dass ich hier seit 2002 bin und weniger als 20 Beiträge habe.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 13:07
von Jonathan
Joah, statisch linken verstößt halt gegen die LGPL, also braucht man wohl die kommerzielle Variante, für die es dann auch Support geben sollte.
Man könnte natürlich auch versuchen, nachträglich die dll's in die exe zu integrieren. Wobei ich mir nicht sicher bin, in wie weit das technisch überhaupt möglich ist. Aber andere hatten schon die selbe Idee:
http://stackoverflow.com/questions/3369 ... le-not-net

Achja: Ich bin mir nicht sicher, ob ein deutsches Qt-Forum der beste Platz dafür ist - in internationalen Foren dürften deutlich mehr Entwickler unterwegs sein, die potentiell helfen können.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 13:40
von Krishty
INe5xIlium(Freak5) hat geschrieben:Danach bekomme ich aber einen Linkerfehler:
1>------ Erstellen gestartet: Projekt: QtGui1Back5Static, Konfiguration: ReleaseStatic x64 ------
1> main.cpp
1> Bibliothek "C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\QtGui1Back5Static.lib" und Objekt "C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\QtGui1Back5Static.exp" werden erstellt.
1>qwindows.lib(qwindowswindow.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_DwmEnableBlurBehindWindow" in Funktion ""bool __cdecl applyBlurBehindWindow(struct HWND__ *)" (?applyBlurBehindWindow@@YA_NPEAUHWND__@@@Z)".
1>qwindows.lib(qwindowswindow.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp_DwmIsCompositionEnabled" in Funktion ""bool __cdecl applyBlurBehindWindow(struct HWND__ *)" (?applyBlurBehindWindow@@YA_NPEAUHWND__@@@Z)".
1>C:\Users\Name\Dropbox\C++Projects2017\QtGui1Back5Static\x64\ReleaseStatic\\QtGui1Back5Static.exe : fatal error LNK1120: 2 nicht aufgelöste Externe
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
Dabei habe ich schon fast alle .libraries verlinkt:
msvcrt.lib;clip2tri.lib;clipper.lib;imm32.lib;opengl32.lib;poly2tri.lib;qdirect2d.lib;qminimal.lib;qoffscreen.lib;qtpcre.lib;qtfreetype.lib;qtharfbuzz.lib;qtlibpng.lib;qtmain.lib;qwindows.lib;UxTheme.lib;winmm.lib;Ws2_32.lib;Qt5AccessibilitySupport.lib;Qt5Charts.lib;Qt5CLucene.lib;Qt5Concurrent.lib;Qt5Core.lib;Qt5DataVisualization.lib;Qt5DBus.lib;Qt5Designer.lib;Qt5DesignerComponents.lib;Qt5DeviceDiscoverySupport.lib;Qt5EventDispatcherSupport.lib;Qt5FbSupport.lib;Qt5FontDatabaseSupport.lib;Qt5Gamepad.lib;Qt5Gui.lib;Qt5Help.lib;Qt5Location.lib;Qt5Multimedia.lib;Qt5MultimediaQuick_p.lib;Qt5MultimediaWidgets.lib;Qt5Network.lib;Qt5NetworkAuth.lib;Qt5Nfc.lib;Qt5OpenGL.lib;Qt5OpenGLExtensions.lib;Qt5PacketProtocol.lib;Qt5PlatformCompositorSupport.lib;Qt5Positioning.lib;Qt5PrintSupport.lib;Qt5Purchasing.lib;Qt5Qml.lib;Qt5QmlDebug.lib;Qt5Quick.lib;Qt5QuickControls2.lib;Qt5QuickParticles.lib;Qt5QuickTemplates2.lib;Qt5QuickTest.lib;Qt5QuickWidgets.lib;Qt5Script.lib;Qt5ScriptTools.lib;Qt5Sql.lib;Qt5Scxml.lib;Qt5SerialBus.lib;Qt5SerialPort.lib;Qt5Sensors.lib;Qt5Svg.lib;Qt5Test.lib;Qt5TextToSpeech.lib;Qt5ThemeSupport.lib;Qt5UiTools.lib;Qt5Widgets.lib;Qt5WebChannel.lib;Qt5WebSockets.lib;Qt5WinExtras.lib;Qt5Xml.lib;Qt5XmlPatterns.lib;Qt53DCore.lib;%(AdditionalDependencies)
Höh? DwmEnableBlurBehindWindow() liegt doch in Dwmapi.lib … mal eingebunden? Windows SDK von Vista oder neuer benutzt (in alten SDK-Varianten existieren die Funktionen nicht)?

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 13:41
von INe5xIlium(Freak5)
Ja, ich hab mich inzwischen schon im englischen angemeldet und übersetze das mal ^^. Wobei technisch gesehen ist statisch linken OK, wenn man den Source mitgibt. Die auf stack-overflow wurde sogar gesagt, dass es reicht die Object files mitzugeben. Das habe ich nicht mehr gefunden, aber diese Seite ist da wohl sehr viel aussagekräftiger:
http://www.gnu.org/licenses/gpl-faq.htm ... cVsDynamic


Edit: Wow, krass. Jetzt funktioniert es :D. Danke Krishty. Hätte ich hier vor Tagen schon Fragen gestellt, wäre ich wohl schon bedeutend weiter und hätte eine MENGE Zeit gespart.
Die Frage ist aber, wie hätte man darauf kommen können? Google hat zu diesen Sprungpunkten gar nichts sinnvolles gefunden.

Edit2: Wahrscheinlich habe ich das "__imp_" beim Googlen mitkopiert :oops:

Re: QT statisch linken (unresolved symbol) [gelöst!]

Verfasst: 09.05.2017, 13:51
von Schrompf
Echt, es geht jetzt? Ich werde Deinen Beitrag mal als Referenz bookmarken, wenn ich das mal wieder mache. Ich wollte damals halt statisch linken, weil ich auch die Runtime statisch haben wollte. Und weil ich es nicht einsehe, dynamisch zu linken, wenn alle DLLs eh sehr tight mit dem selben Compiler und den selben Einstellungen gebaut werden müssen, damit das Name Mangeling und die Heap-Implementation übereinstimmen.

Denn allgemeines Wissen sagt ja: DLL-Schnittstellen sollten nur C-API sein, weil das Name Mangeling nicht normiert ist. Und auf Windows darfst Du außerdem keinen Speicher-Besitz über DLL-Grenzen transportieren, weil die Heap-Implementation evtl. leicht abweicht und es demzufolge crasht, wenn Du Speicher (wie z.B. einen std::string) in der DLL allokierst und außerhalb frei gibst.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 14:01
von Krishty
INe5xIlium(Freak5) hat geschrieben:Edit2: Wahrscheinlich habe ich das "__imp_" beim Googlen mitkopiert :oops:
Der Compiler setzt das für einige importierte DLL-Funktionen davor, aber nicht immer (ich weiß nicht, wieso). Der Hinweis war eher, dass DWM die Desktop Window Manager-Komponente des Kernels ist, und die Namen daher sehr stark nach WinAPI-Funktionen klangen.

Re: QT statisch linken (unresolved symbol)

Verfasst: 09.05.2017, 14:11
von INe5xIlium(Freak5)
Krishty hat geschrieben:Der Hinweis war eher, dass DWM die Desktop Window Manager-Komponente des Kernels ist, und die Namen daher sehr stark nach WinAPI-Funktionen klangen.
Mein Problem war wohl, dass ich mir fast sicher war, dass es irgendein QT-Theme ist, was diese Probleme macht.
Generell bin ich überrascht, wie aktiv das Forum noch ist. Ich dachte, dass seit 2007 nicht mehr viel in Foren los ist. ^^. (also seit Leute StudiVZ und Facebook nutzen)

Re: QT statisch linken (unresolved symbol) [gelöst!]

Verfasst: 09.05.2017, 14:13
von Krishty
Schrompf hat geschrieben:Ich wollte damals halt statisch linken, weil ich auch die Runtime statisch haben wollte. Und weil ich es nicht einsehe, dynamisch zu linken, wenn alle DLLs eh sehr tight mit dem selben Compiler und den selben Einstellungen gebaut werden müssen, damit das Name Mangeling und die Heap-Implementation übereinstimmen.
Naja – die Entscheidung dahinter ist ja, Usern zu erlauben, ihre Bibliotheken selber zu kompilieren. So dass ich z.B. nach einer kritischen Sicherheitslücke Qt selber kompilieren und in deinem Programm ersetzen darf, ohne auf ein Update von dir warten zu müssen. Oder mein eigenes Qt nutzen darf, um dein Programm an meine Wünsche anzupassen. Und da stehe ich theoretisch sehr stark hinter, wenngleich ich in der Praxis nie was selber kompiliere weil es IMMER eine Woche Pain in the Ass bedeutet.
INe5xIlium(Freak5) hat geschrieben:P.S.: Wo sind meine ganzen Beiträge eigentlich hin? Ich hatte definitiv mal >2000. Das glaubt mir doch sonst auch keiner, dass ich hier seit 2002 bin und weniger als 20 Beiträge habe.
Wir haben ZFX 2009 neu gestartet, weil niemand mehr Zeit hatte, die alte Software zu warten. Deine alten Beiträge sind höchstwahrscheinlich hier, aber die Zähler wurden im neuen Portal alle zurückgesetzt.

Re: QT statisch linken (unresolved symbol) [gelöst!]

Verfasst: 09.05.2017, 14:18
von INe5xIlium(Freak5)
Eines meiner letzten Themen:
ATL statisch linken http://old.zfx.info/DisplayThread.php?TID=22815
:lol:

Ich stelle wohl alle 10 Jahre die gleichen Fragen. Irgendwie habe ich das aber geschafft, ich glaube, ich habe die .dll mit dem Hexeditor getauscht, weil der wollte die atl80.dll und die atl.dll hat auch funktioniert. :D

P.S.: Statt einem langsamen Dualcore einen Ryzen zu haben oder so würde jetzt sicher helfen :twisted:

Re: QT statisch linken (unresolved symbol)

Verfasst: 10.05.2017, 10:24
von Thoran
Jonathan hat geschrieben:Joah, statisch linken verstößt halt gegen die LGPL,
Nein, es ist erlaubt. Nur muss man den den Quellcode der eigenen Anwendung/Bibliothek oder die Objektdateien ausliefern, sowie Installationsanleitungen , um die Anwendung/Bibliothek durch den Benutzer gegen eine eigene Version der LGPL Bibliothek zu erzeugbar zu machen. Außerdem gilt das alles nur im Fall, dass man Software verteilt. Wenn die LGPL Bibliothek nur zum privaten gebrauch kompiliert wird, dann ist das gar kein Problem eine statische Version zu bauen (z.B. eigener Serverdaemon).

Zum Thema Qt statisch/statisch mit statischer RT habe ich ein Tutorial angefangen, aber nicht beendet, da ich es zwischenzeitlich für common knowledge gehalten habe. Aber wenn Interesse besteht, wie ich das gemacht habe kann ich den Artikel gern fertigstellen und auf meiner Webseite veröffentlichen. BTW, vom Linken gegen eine statische RT bin ich wieder abgekommen, weil das letzten Endes der "Highway to Hell" war (ich hatte z.B. PostgreSQL als Dependency von Qt).

Thoran

Re: QT statisch linken (unresolved symbol) [gelöst!]

Verfasst: 10.05.2017, 17:46
von INe5xIlium(Freak5)
Ich habe Interesse und dafür hier ein neues Thema aufgemacht: https://zfx.info/viewtopic.php?f=4&t=4241

Ich denke die Frage ob statisch oder dynamisch hängt von der Projektgröße ab, oder? Wenn es nur ein kleines Beispiel als Showcase ist, dann möchte ich lieber statisch linken, damit es leicht überall läuft und transportabel ist. Wenn es etwas größer wird, stört es auch nicht, wenn ein paar .dll Dateien mitgeliefert werden müssen. Wenn es richtig groß wird, ist auch ein Installer akzeptabel.

Wegen der Lizenz: Es wird auch oft gesagt, dass es reicht die .obj files zu liefern. Wobei ich irgendwo gelesen habe, dass man die Schnittstelle zur Library trotzdem OpenSource machen muss.