簡體   English   中英

靜態構建Qt + Qbs

[英]Static build Qt+Qbs

我創建了一個簡單的控制台應用程序“Hello world”。 首先,我用qmake編譯它:hello.pro

QT += core
QT -= gui

CONFIG += c++11

TARGET = hello
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

應用程序正常構建,並且在未安裝Qt和MinGW的系統上正常工作。 可執行文件的大小為3.58MB。

接下來,我們使用QBS構建系統編譯相同的源代碼。 Hello.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的可執行文件的大小是相同的)。

答案被發現:

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)鏈接器faild有錯誤:

unrecognized -a option `tic-libgcc'

WTF?

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

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

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

  1. 您確定要以相同的模式構建(調試與發布)嗎? 請注意,對於qbs,默認為debug。 如果要更改,請在命令行上將qbs.buildVariant設置為“release”。

  2. 比較qmake和qbs生成的鏈接器命令行應該可以讓您深入了解哪些庫被引入以及如何引入。 使用qbs'--command-echo-mode選項查看使用的完整命令行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM