2017-09-13 101 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文件(请参考我对此问题的回答)/ –