Я создаю простое консольное приложение «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 одинаковы).
Ответ был найден:
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"}
consoleApplication: true // CONFIG += console
cpp.cxxLanguageVersion: "c++11" // CONFIG += c++11
(Я игнорирую настройки комплекта, так как вы, очевидно, работаете в Windows.)
Вы уверены, что вы работаете в том же режиме (отладка против выпуска)? Обратите внимание, что с qbs по умолчанию используется отладка. Установите qbs.buildVariant в значение «release» в командной строке, если вы хотите это изменить.
Сравнение командных строк компоновщика, созданных qmake и qbs, должно дать вам представление о том, какие библиотеки используются и как. Используйте qbs ‘—command-echo-mode, чтобы увидеть все используемые командные строки.