1

我创建了一个简单的控制台应用程序“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 构建系统编译相同的源代码。你好.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 的可执行文件的大小是相同的)。

4

2 回答 2

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) 链接器失败并出现错误:

unrecognized -a option `tic-libgcc'

怎么回事?

解决方案:对于 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"
}
于 2017-09-14T09:37:22.407 回答
1
  1. 这两个项目文件并不完全对应。您应该添加:

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

(我忽略了捆绑设置,因为您显然在 Windows 上。)

  1. 您确定您正在以相同的模式构建(调试与发布)吗?请注意,对于 qbs,默认为调试。如果要更改它,请在命令行上将 qbs.buildVariant 设置为“release”。

  2. 比较 qmake 和 qbs 生成的链接器命令行应该可以让您深入了解哪些库被拉入以及如何拉入。使用 qbs 的 --command-echo-mode 选项查看使用的完整命令行。

于 2017-09-13T22:18:14.500 回答