Как заставить Qt и Qtcreator связывать библиотеки статически, а не динамические?

Я знаю, что это может быть вопрос, похожий на многие другие, но после многократного поиска и неспособности получить окончательное и эффективное решение, я должен задать этот вопрос.

Я использую Qt 5.2.0 для Windows 32-bit (VS 2010, 570 MB), и я уже сделал свое программирование, и все это сделано. Но теперь я хочу распространять его как .exe файл для своих коллег, но для этого без осложнений и для того, чтобы не распространять DLL файлы, мне нужно построить программу, используя статические ссылки.

Не могли бы вы описать, как я могу сделать Qt 5.2.0 для Windows 32-bit (VS 2010, 570 МБ) построить целую программу, используя статические ссылки?

Спасибо.

Ответы

Ответ 1

Вы можете использовать переменную CONFIG для этого с помощью qmake:

CONFIG += static

или

CONFIG += staticlib

Однако вам нужно будет убедиться, что у вас есть все библиотеки, которые вы хотите связать, доступные как статические.

В том числе и сама структура Qt, если вы соответствуете лицензии для этого. В официальной установке устанавливаются только динамические библиотеки (DLL файлы), поэтому вам нужно будет построить Qt самостоятельно, чтобы выполнить это.

Вы можете использовать следующие команды для создания Qt статически для вашей собственной цели:

configure -developer-build -opensource -nomake examples -nomake tests -static
qmake -r
nmake

Обратите внимание, что в общем случае при создании сторонних Qt-программ, подобных вашим, вы лучше вызываете qmake со следующим параметром, чтобы правильно передать свою среду:

qmake -r -spec win32-msvc2010 

Пожалуйста, также отметили, что, как пишет Frank и ManuelH в комментарии, статическая связь не допускается, если ваше приложение не имеет бесплатной лицензии либо LGPL, либо, по крайней мере, совместимо с LGPL, и вы не используете коммерческую лицензию для Qt. Лучше убедиться в этом, прежде чем поднять свой подход.

Как только это будет сделано, вы можете использовать переменную LIBS в обычном порядке, например: передать путь вашей статической библиотеки к ней вместе с именем библиотеки, что-то вроде этого:

LIBS += -L/path/to/the/static/library -lstaticlibraryname

Обратите внимание, что имя статической библиотеки, переданное параметру -l, не должно содержать расширение статической библиотеки, например .lib в Windows.

В качестве резервной копии вы всегда можете связать другие библиотеки статически и поместить файлы dll Qt рядом с исполняемым файлом, и вы разворачиваете папку как "пакет". Это, вероятно, более легкий путь для вас.