Qt 4.8: Unschöne Buttons etc. bei static linking unter Windows



  • Hallo ihr,

    ich habe ein einfaches GUI-Programm mit C++ und Qt4.8 erstellt, welches ein paar Bekannte gerne auf ihren Windows 7-Rechnern nutzen würden. Dazu habe ich die Qt-Libs statisch verlinkt.
    Bei den Builds auf meinem Entwicklungsrechner waren die Buttons und andere Elemente immer im Windows 7-Style, bei der statisch verlinkten Version war alles in so einem recht hässlichen Win98-Look (siehe Bild) - auch auf dem Rechner, auf dem Qt installiert ist. Wie bekomme ich es hin, dass auch bei der Release-Version das "Win7-Style" verwendet wird? Schränkt das Programm zwar nicht ein, sieht aber schon 'ne ganze Ecke hübscher aus... 😉

    Gruß, Julian

    Bild: http://www.bilder-upload.eu/show.php?file=f0cb79-1354360097.png



  • Du musst wohl das Manifest einbinden:
    http://qt-project.org/doc/qt-5.0/deployment-windows.html Abschnitt Manifest

    Übrigens wenn du keine kommerzielle Lizenz von Qt hast, dann musst du deinen Quellcode auf Anfrage herausgeben.



  • Hallo Softwaremaker, danke für Deine Antwort. Leider hat es nicht geklappt. Nach Hinzufügen von CONFIG += embed_manifest_exe hat sich nichts verändert. Außerdem konnte ich aus der äußerst knapp gehaltenen Beschreibung nicht herauslesen, welche Dateien genau in den Ordner mit der .exe gehören...
    Übrigens arbeite ich mit mit dem MinGW32-Compiler, falls das hilft.

    Softwaremaker schrieb:

    Übrigens wenn du keine kommerzielle Lizenz von Qt hast, dann musst du deinen Quellcode auf Anfrage herausgeben.

    Alles klar - war das etwa schon eine Anfrage? 😉

    Es handelt sich übrigens um ein Programm zur Erzeugung einer Notenübersicht als PDF oder direkt an den Drucker. Also falls die Pädagogen unter euch Interesse haben, gebe ich den Code natürlich gerne weiter!



  • So würde ich das nicht formulieren. Die kostenlose Version von Qt ist LGPL. Wenn du das statisch reinlinkst, musst du den source code von deinem Programm und allen Änderungen an der Qt freigeben, nicht nur auf Anfrage.



  • Mechanics schrieb:

    So würde ich das nicht formulieren. Die kostenlose Version von Qt ist LGPL. Wenn du das statisch reinlinkst, musst du den source code von deinem Programm und allen Änderungen an der Qt freigeben, nicht nur auf Anfrage.

    Nach meinem Verständnis der (L)GPL reicht es vollkommen aus den Quellcode auf Anfrage rauszugeben, wenn man es so explizit anbietet. Außerdem muss der Quellcode nicht an QT gehen, sondern an denjenigen der das Programm bekommt. Aber vielleicht les ich das auch nur falsch.



  • Ich kann mir gut vorstellen, dass beim Statischen linken der Teil für den "native "Windows style nicht mit gelinkt wird.

    Hier habe ich was diesbezüglich was gefunden (OS ist linux aber das sollte egal sein)

    http://www.qtcentre.org/threads/47216-Qt-Application-looks-ugly-with-static-linking-but-fine-with-shared-linking



  • Tobiking2 schrieb:

    Mechanics schrieb:

    So würde ich das nicht formulieren. Die kostenlose Version von Qt ist LGPL. Wenn du das statisch reinlinkst, musst du den source code von deinem Programm und allen Änderungen an der Qt freigeben, nicht nur auf Anfrage.

    Nach meinem Verständnis der (L)GPL reicht es vollkommen aus den Quellcode auf Anfrage rauszugeben, wenn man es so explizit anbietet. Außerdem muss der Quellcode nicht an QT gehen, sondern an denjenigen der das Programm bekommt. Aber vielleicht les ich das auch nur falsch.

    Hmm, bin mir jetzt auch nicht sicher... Auf wikipedia steht zumindest "Grundsätzlich darf eine unter LGPL lizenzierte Software nur zusammen mit ihrem Quelltext vertrieben werden.". Ich bin jetzt aber kein Lizenzexperte, kann sein, dass man den Quellcode tatsächlich erst auf Anfrage rausrücken muss.



  • LGPL 2.1 §4:

    Wenn die Weitergabe von Objektcode durch das Angebot eines Zugangs zum Kopienabruf von einem angegebenen Ort erfolgt, dann erfüllt das Angebot eines gleichwertigen Zugangs zum Kopieren des Quelltextes von demselben Ort die Anforderung, auch den Quelltext weiterzugeben, obwohl Dritte nicht verplichtet sind, den Quelltext zusammen mit dem Objektcode zu kopieren.

    Das heisst:
    - Programm als Download: Source muss nicht integriert sein, sondern kann als separater Download aber von gleicher Stelle (gleiche Webseite) erfolgen
    - Programm auf CD: Source muss sich mit auf der CD befinden.

    Also reicht "auf Nachfrage" wohl nicht aus. Gibt er sein Programm seinen Freunden weiter, dann muss der Sourcecode mit. Also mit auf USB-Stick oder bei E-Mail Versand Programm inkl. Source.

    Zum Problem:
    Erstell mal eine extra Manifest-Datei im gleichen Ordner wie die Exe.
    also:
    MeinSuperProgramm.exe
    MeinSuperProgramm.exe.manifest
    wie die Datei aussehen muss findest du bei Google.
    Wenn das nicht klappt liegs wohl am statischen Linken von Qt.
    Link doch einfach dynamisch und benutze einen Selbstentpacker, da ist Exe und Qt-DLLs in einer Exe gepackt, beim starten wird alles in ein temporäres Verzeichnis entpackt und die Exe gestartet. Klappt prima und du musst deinen Code nicht offenlegen.



  • Softwaremaker schrieb:

    LGPL 2.1 §4:

    Wenn die Weitergabe von Objektcode durch das Angebot eines Zugangs zum Kopienabruf von einem angegebenen Ort erfolgt, dann erfüllt das Angebot eines gleichwertigen Zugangs zum Kopieren des Quelltextes von demselben Ort die Anforderung, auch den Quelltext weiterzugeben, obwohl Dritte nicht verplichtet sind, den Quelltext zusammen mit dem Objektcode zu kopieren.

    Die Aussage dieses Ausschnitts finde ich etwas schwierig. Für mich klingt das einfach nur danach, dass Dritte den Quellcode nicht weitergeben müssen, egal wie leicht sie ihn erlangen könnten. Ich bin aber kein Anwalt der über irgendwelche Formulierungen argumentieren könnte. Daher habe ich eine andere Argumentation:

    QT ist auch unter der GPL erhältlich bzw. lässt sich nach LGPL 2.1 $3 unter der GPL 2 relizensieren.

    Aus der GPL 2 §3.2

    Liefern Sie das Programm zusammen mit einem mindestens drei Jahre lang gültigen schriftlichen Angebot aus, jedem Dritten eine vollständige maschinenlesbare Kopie des Quelltextes zur Verfügung zu stellen – zu nicht höheren Kosten als denen, die durch das physikalische Zugänglichmachen des Quelltextes anfallen –, wobei der Quelltext unter den Bedingungen der Paragraphen 1 und 2 auf einem für den Datenaustausch üblichen Medium weitergegeben wird.

    Also eindeutig ein "auf Nachfrage", man muss nur deutlich machen das es möglich ist den Quellcode zu bekommen.

    In dem Paragraph unterscheidet sich die GPL übrigens zu dem oberen Zitat aus der LGPL, da hier Dritte verpflichtet sind den Quellcode oder das Angebot mit dem Programm weiterzugeben. Ansonsten ist die LGPL eigentlich die laschere Variante der GPL und mich würde es schwer wundern wenn sie etwas verbietet das in der GPL erlaubt ist.



  • Also, der letzte Tip von Softwaremaker hat zum gewünschten Ziel geführt (Vielen Dank dafür und auch für alle anderen konstruktiven Beiträge): ich habe eine dynamisch gelinkte .exe erstellt und mit dem "Dependency Walker" dann die benötigten dlls ermittelt.

    Noch allgemein zur Diskussion hier: ich habe wegen dem stat. Linken jetzt einiges gegoogelt und fast immer hat eine Frage, welche mit dem Verlinken der Qt-Libs zu tun hatte eine solche Diskussion losgetreten. Ich finde das als Qt-Neuling sehr befremdlich und der OpenSource-Entwicklung sicher nicht nur zuträglich (ein Hinweis auf die Lizenz für einen Neuling wie mich hätte gereicht).
    Wer den Film "Das Leben des Brian" gesehen hat, wird durch solche Threads unweigerlich an die "Volksfront von Judäa" bzw. die "Judäische Volksfront" erinnert... (für diejenigen, die den Film nicht gesehen haben: diese Gruppierungen wollen eigentlich das Gleiche, behindern sich aber gegenseitig so sehr, dass sie kurz vor dem Erreichen des Ziels zusammen untergehen).

    Wenn ich mir die Korinthenkackerei hier ansehe, verstehe ich die Closed-Source-Entwickler, welche auf kommerzielles Microsoft VC++ setzen, ihren Code gar nicht rausgeben, Linux/OS X links liegen lassen und sich so eine Menge Ärger vom Hals halten. Schade eigentlich - die judäische Volksfront oder die Volksfront von Judäa lassen grüßen... 😞



  • Nein, es ist die Stimme der Vernunft die dort Spricht.

    In naher Zukunft wird eh nur noch OpenSource geben, also gewöhne dich besser daran den Quellcode Mitzuliefern.
    Das vorenthalten des Quellcodes stellt einen gewaltigen Einschnitt in die Rechte der Freiheit dar.
    Wer seine Programme nicht mit der ganzen Welt teilt, stellt nicht nur sich selbst ein Bein, sondern ist auch noch Elitär obendrein.

    Gute Besserung, wünscht
    Apfelbaum



  • Apfelbaum schrieb:

    In naher Zukunft wird eh nur noch OpenSource geben, also gewöhne dich besser daran den Quellcode Mitzuliefern.

    Kannst Du eine Quelle für diese abenteuerliche Behauptung nennen?

    Apfelbaum schrieb:

    Das vorenthalten des Quellcodes stellt einen gewaltigen Einschnitt in die Rechte der Freiheit dar.

    Die Rechte der Freiheit? Welche sollen das denn sein?
    Und der Zwang, den Quellcode veröffentlichen zu müssen, stellt doch ebenso einen Einschnitt in mein Recht als Urheber/Programmierer dar! SINN?!? 🙄

    Kann es sein, dass es Dir sowohl an Lebenserfahrung (Alter <=16?) als auch an Fachwissen mangelt, und Du mal den Begriff "OpenSource" in Verbindung mit "kostenlos" gehört hast und denkst "Whoa GEIL!"? 😉



  • Kannst Du eine Quelle für diese abenteuerliche Behauptung nennen?

    Denk mal nach. Jedes Programm, dass gegen GPL Code Linkt oder ihn verwendet muss auch GPL sein. Die Zeit der Kostenpflichtigen Bibliotheken sind immer weiter ab.
    LGPL ist eine Übergangslösung für die totale Freiheit.
    Wer also nicht alles von vorne Entwickeln will, der kommt um die GPL nicht mehr herum.
    Auch wenn M$ oder Apple das nicht wahrhaben wollen, aber Firmen die das Gute verkörpern, wie Google oder Redhat machen es vor, wie man in Zukunft Geld verdient.

    Die Rechte der Freiheit? Welche sollen das denn sein?

    Die Rechte den Quellcode der Software zu lesen, diesen zu modifizieren und ihn an meine Mitmenschen weiter geben zu können.
    http://opensource.org/
    http://www.fsf.org/



  • Meine Beiträge sind natürlich alle unter GPL lizenziert.



  • @Apfelbaum:
    Ich will dir deine Träume nicht zerstören, aber sie entsprechen nicht der Realität.

    Denk mal nach. Jedes Programm, dass gegen GPL Code Linkt oder ihn verwendet muss auch GPL sein. Die Zeit der Kostenpflichtigen Bibliotheken sind immer weiter ab.
    LGPL ist eine Übergangslösung für die totale Freiheit.
    Wer also nicht alles von vorne Entwickeln will, der kommt um die GPL nicht mehr herum.
    Auch wenn M$ oder Apple das nicht wahrhaben wollen, aber Firmen die das Gute verkörpern, wie Google oder Redhat machen es vor, wie man in Zukunft Geld verdient.

    Qt gibts mit GPL, LGPL und kommerziell.
    wxWidgets ist LGPL mit mehr Freiheiten (dynamisch/statisch Linken ist egal) genauso wie FLTK.
    GTK+ ist LGPL.
    Ich als Entwickler lege also fest ob mein Programm GPL, LGPL oder andere Lizenz haben soll. Sollten o.g. Libs wirklich alle (sehr unwahrscheinlich) von LGPL auf GPL umsteigen (geht das überhaupt?), dann nehme ich eine kommerzielle Qt-Lizenz oder zur Not auch wieder MFC und da kann ich machen was ich will.
    Gibt es überhaupt eine viel benutzte Lib die nur GPL hat?

    Lib-Entwickler nutzen gerne LGPL. Es gibt wohl so einige die Apfelbaums Träume haben und GPL lieben aber die treffen früher oder später auf die Realität. Denn viele Programmierer wollen den eigenen Code nicht offenlegen (auch nicht bei kostenlosen Programmen) und meiden solche Libs dann. Das passt den Lib-Entwicklern nicht und deshalb die LGPL. Die GPL-Fans sind (etwas) besänftigt und der Closed-Source-Programm-Entwickler kann die Lib nutzen, hat halt nur ein paar Einschränkungen wie z.B. dynamisches Linken.



  • Wer also nicht alles von vorne Entwickeln will, der kommt um die GPL nicht mehr herum.
    Auch wenn M$ oder Apple das nicht wahrhaben wollen, aber Firmen die das Gute verkörpern, wie Google oder Redhat machen es vor, wie man in Zukunft Geld verdient.

    Naja, mir ist es zum beispiel expliziet verboten, GPL lizenzierte bibliotheken zu verwenden.
    LGPL wird kritisch gesehen, geht nur im Einzelfall nach Prüfung von der Rechtsabteilung. (dynamisch linken per importlib unter windows ist zum Beispiel umstritten, und da gibts auch kaum vergleichsurteile zu)
    Ich bin also auf Freeware oder auf kommerzielle Lizenzen angewiesen.

    Wobei "Frei" auch "relativ" kritisch sein kann. Wir haben kürzlich erst ein "freies" Protokoll freistellen und ersetzen muessen, weil sich der Rechteinhaber durch eine Klausel absolute "Klagefreiheit" zusicheren lassen wollte. Stand wirklich wortwörtlich drin, das man sich mit Benutzung des Protokolls ... und Bibliotheken verpflichted, keinerlei rechtliche Schritte gegen den RechteInhaber vorzunehmen, auch auf Verträge bezogen die gar nichts mit dem Protokoll zu tun haben.

    Das nur als Tipp, das man sich auch bei "freeware" mal die Nutzungsbedingungen durchlesen sollt ^^

    Ich behaupt also weiterhin, das bei professioneller SW Entwicklung die kommerziellen Lizenzen Ihre Bedeutung behalten ....

    Meistens gibts aber fuer die "wichtigen" Libs, duale Lizenzen ...

    Ciao ....



  • ib-Entwickler nutzen gerne LGPL. Es gibt wohl so einige die Apfelbaums Träume haben und GPL lieben aber die treffen früher oder später auf die Realität. Denn viele Programmierer wollen den eigenen Code nicht offenlegen (auch nicht bei kostenlosen Programmen) und meiden solche Libs dann. Das passt den Lib-Entwicklern nicht und deshalb die LGPL. Die GPL-Fans sind (etwas) besänftigt und der Closed-Source-Programm-Entwickler kann die Lib nutzen, hat halt nur ein paar Einschränkungen wie z.B. dynamisches Linken.

    Dann sollen sie halt ihre Programme selbst entwickeln. Ist doch nicht mein Problem, wenn die Gelder für Proprietären Schrott ins unermessliche Steigen.
    Die LGPL wurde nicht für GPL Jünger, sonder um die Akzeptanz in einem von einer Proprietären Lib dominiertem Markt zu erhöhen.
    Ist also nur eine Übergangslösung.

    Naja, mir ist es zum beispiel expliziet verboten, GPL lizenzierte bibliotheken zu verwenden.

    Selbst schuld. Wechsele doch deinen Arbeitgeber.

    Ich behaupt also weiterhin, das bei professioneller SW Entwicklung die kommerziellen Lizenzen Ihre Bedeutung behalten ....

    Professionelle Software wird meist billiger unter GPL entwickelt.



  • Ich kenne schon mindetens 2-3 Konkurrenten, die nur darauf warten, dass wir unseren Source freigeben ^^ Vergiss es, so lange Menschen was zu Essen haben wollen und einige davon ihr Essen durch Programmieren verdienen wollen, wird es auch closed source und kommerzielle Programme und Bibliotheken geben. Daran ist auch nichts verwerfliches. Menschen wollen für ihre Arbeit bezahlt werden und wollen nicht, dass andere sich einfach so an ihrer Arbeit bereichern. Wenn man mal davon ausgeht, dass man auch mit Service und nicht mit Lizenzen ganz gut verdienen kann, was ja auch stimmt, ist man trotzdem runiniert, wenn das Konkurrenzprodukt plötzlich Features hat, die sie nicht ohne weiteres selber hätten implementieren können.
    Deine "unermesslichen" Kosten für kommerzielle Bibliotheken sind meist vernachlässigbar. Die Preise für die meisten "kleineren" kommerziellen Bibliotheken liegen meist weit unter dem Gehalt eines Entwicklers. Und wenn man teure Bibliotheken nimmt, wie Game Engines oder CAD Engines, dann stecken da etliche Mannjahre Arbeit drin und somit sind sie ihr Geld auch wieder wert.
    Außerdem weiß man bei kommerziellen Bibliotheken auch, dass da eine Firma dahinter steckt, dass es weiterentwickelt wird, dass es Support gibt usw. Bei "GPL" Bibliotheken (die großen, bekannten usw. mal ausgenommen) muss man sich meist fragen, ob das jetzt nicht irgendein Schüler zusammengeschustert hat, der nächstes Jahr vielleicht keinen Bock mehr auf das Projekt hat.



  • allo Softwaremaker, danke für Deine Antwort. Leider hat es nicht geklappt. Nach Hinzufügen von CONFIG += embed_manifest_exe hat sich nichts verändert. Außerdem konnte ich aus der äußerst knapp gehaltenen Beschreibung nicht herauslesen, welche Dateien genau in den Ordner mit der .exe gehören...
    Übrigens arbeite ich mit mit dem MinGW32-Compiler, falls das hilft.



  • Du erstellst eine Datei die den gleichen Namen hat wie die EXE, jedoch anstatt ".exe" muss am Ende ".exe.manifest" stehen und in der Datei steht folgendes

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > 
     <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MEINPROGRAMM" type="win32" /> 
     <description>MEINPROGRAMM</description> 
     <dependency> 
      <dependentAssembly> 
       <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
      </dependentAssembly> 
     </dependency>
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
       <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
       </requestedPrivileges>
      </security>
     </trustInfo>
     <asmv3:application>
      <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
       <dpiAware>true</dpiAware>
      </asmv3:windowsSettings>
     </asmv3:application>
    </assembly>
    

Log in to reply