2017-09-13 135 views
1

我創建了一個簡單的控制檯應用程序「Hello world」。首先,我的qmake編譯:hello.pro靜態構建Qt + Qbs

QT += core 
QT -= gui 

CONFIG += c++11 

TARGET = hello 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 

的應用程序正常,沒有安裝Qt和MinGW的,做工精細的系統上建造。可執行文件的大小是3.58MB。

接下來,我們使用QBS編譯系統編譯相同的源代碼。您好.qbs:

import qbs 

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

可執行文件大小爲4.35MB。該應用程序需要「libwinthread-1.dll」,「libstdC++ - 6.dll」和「libgcc_s_dw2-1.dll」。

一個問題:如何正確地在QBS中構建一個靜態應用程序,同時使用上述庫的靜態鏈接,並使可執行文件的大小相同? (使用標準版本的項目,沒有靜態,Qmake和Qbs的可執行文件的大小是相同的)。

回答

2

答發現:

import qbs 

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

的文件大小仍然當你與QMAKE編譯大於(我認爲這是由於QBS的微調)。但是,主要問題解決了:應用程序不需要額外的dll。

UPD:此解決方案適用於QBS 1.6.0。對於最新的版本(1.9.0)連接zhcon失敗,出現錯誤:

unrecognized -a option `tic-libgcc' 

跆拳道?

SOLUTION:對於QBS 1.9.0,您必須使用下面的代碼:

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. 這兩個項目文件並不完全對應。您應該添加:

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

(我忽略了捆綁設置,你顯然是在Windows上)

  • 你確定你正在建立在相同的模式(調試vs釋放)?請注意,使用qbs時,默認值爲debug。如果你想改變它,請在命令行上將qbs.buildVariant設置爲「釋放」。

  • 比較由qmake和qbs生成的鏈接器命令行應該讓您深入瞭解哪些庫被拉入以及如何操作。使用qbs'--command-echo-mode選項查看完整的命令行。

  • +0

    Christan,感謝您的回答。關於您的優惠:1)不會導致任何更改。 2)我相信這兩個項目都是在發佈模式下構建的。 3)對於這個提示,謝謝。我發現該項目的鏈接是錯誤的,之後我修復了qbs文件(請參考我對此問題的回答)/ –