2017-09-13 4 views
1

ich eine einfache Konsolenanwendung „Hallo Welt“. Zuerst habe ich kompilieren es mit qmake: hello.proStatic bauen Qt + qBS

QT += core 
QT -= gui 

CONFIG += c++11 

TARGET = hello 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 

Die Anwendung ist builded normal und auf einem System ohne installierte Qt und MinGW funktionieren. Die Größe der ausführbaren Datei beträgt 3,58 MB.

Als nächstes erstellen wir den gleichen Quellcode unter Verwendung der QBS System aufzubauen. Hello.qbs:

import qbs 

CppApplication { 
    Depends{ 
     name: "Qt" 
     submodules: [ 
      "core", 
     ] 
    } 
    name: "HelloWorld-minimal" 
    files: "main.cpp" 
} 

Die ausführbare Dateigröße beträgt 4,35 MB. Die Anwendung benötigt "libwinhthread-1.dll", "libstdC++ - 6.dll" und "libgcc_s_dw2-1.dll".

Eine Frage: Wie baue ich eine statische Anwendung in QBS mit statischer Verknüpfung der oben genannten Bibliotheken und damit die Größe der ausführbaren Datei die gleiche war?

(Mit dem Standard-Build des Projektes, ohne Statik sind die Größen von ausführbaren Dateien mit Qmake und mit qBS gleich).

Antwort

2

Antwort gefunden:

import qbs 

CppApplication { 
    Depends{ 
     name: "Qt" 
     submodules: [ 
      "core", 
     ] 
    } 
    Properties { 
     condition: Qt.core.staticBuild 
     cpp.linkerFlags: [ 
      "-static", 
      "-static-libgcc" 
     ] 
    } 
    name: "HelloWorld-minimal" 
    files: "main.cpp" 
} 

Die Dateigröße größer bleibt als wenn Sie mit qmake kompilieren (ich nehme an, dass dies aufgrund der Feinabstimmung der QBS ist). Jedoch das Hauptproblem ist gelöst: Die Anwendung erfordert keine zusätzlichen DLLs.

UPD: Diese Lösung funktioniert für QBS 1.6.0. Für neueste Version (1.9.0) Linker faild mit Fehler:

unrecognized -a option `tic-libgcc' 

WTF?

LÖSUNG: Für QBS 1.9.0 zum nächsten Code verwendet wird, muss:

import qbs 

CppApplication { 
    Depends{ 
     name: "Qt" 
     submodules: [ 
      "core", 
     ] 
    } 

    Properties { 
     condition: Qt.core.staticBuild 
     cpp.driverFlags: [ 
      "-static", 
      "-static-libgcc", 
     ] 
    } 
    name: "HelloWorld-minimal" 
    files: "main.cpp" 
} 
1
  1. Die beiden Projektdateien stimmen nicht vollständig überein. Sie sollten hinzufügen:

consoleApplication: true // CONFIG += console 
cpp.cxxLanguageVersion: "c++11" // CONFIG += c++11 

(. Ich die Bundle-Einstellungen bin zu ignorieren, wie Sie offenbar auf Windows sind)

  1. Sind Sie sicher, dass Sie bauen im selben Modus (Debug vs Release)? Beachten Sie, dass der Standardwert bei qbs Debugging ist. Setzen Sie qbs.buildVariant in der Befehlszeile auf "release", wenn Sie dies ändern möchten.

  2. Vergleich der Linker-Befehlszeilen von qmake und QBS hergestellt werden, sollten Sie einen Einblick geben in die und wie gezogen Bibliotheken erhalten. Verwenden Sie die --command-echo-mode-Option von qbs, um die verwendeten Befehlszeilen vollständig anzuzeigen.

+0

Christan, danke für deine Antwort. Über Ihre Angebote: 1) führt zu keinerlei Änderungen. 2) Ich bin mir sicher, dass beide Projekte im Release-Modus aufbauen. 3) Für diesen Tipp, danke.Ich habe festgestellt, dass die Verknüpfung des Projekts falsch ist, danach habe ich die QBS-Datei korrigiert (Bitte lesen Sie meine Antwort zu dieser Frage) / –

Verwandte Themen