我创建一个简单的控制台应用程序“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和带有Qb的可执行文件的大小是相同的)。

最佳答案

找到答案:

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),链接器失败,并显示以下错误:
unrecognized -a option `tic-libgcc'

WTF?

解决方案:对于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"
}

10-05 21:13