Как заставить 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 рядом с исполняемым файлом и развернуть папку как "пакет". Это, вероятно, более легкий путь для вас.