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

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

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

Не могли бы вы описать, как я могу заставить Qt 5.2.0 для 32-битной Windows (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 

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

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

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

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

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

Другие вопросы по тегам