Статическая сборка 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,58 МБ.

Далее мы скомпилируем тот же исходный код, используя систему сборки QBS. Hello.qbs:

import qbs

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

Размер исполняемого файла составляет 4,35 МБ. Приложение требует «libwinthread-1.dll», «libstdc ++ — 6.dll» и «libgcc_s_dw2-1.dll».

Вопрос: как правильно построить статическое приложение в QBS со статическим связыванием вышеперечисленных библиотек и чтобы размер исполняемого файла был одинаковым?

(При стандартной сборке проекта без статики размеры исполняемых файлов с Qmake и с Qbs одинаковы).

1

Решение

Ответ был найден:

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"}
2

Другие решения

  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, чтобы увидеть все используемые командные строки.

1

По вопросам рекламы [email protected]