Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 555, средняя оценка - 4.62
deadlock
376 / 355 / 8
Регистрация: 14.12.2010
Сообщений: 1,265
#1

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll - C++ Qt

27.01.2011, 00:55. Просмотров 70175. Ответов 4

В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу перевод буржуйской вики по отлучению программ Qt от своих библиотек.
То есть статической линковке приложений с библиотеками, в результате чего получается автономный исполняемый файл, запускаемый на любом компьютере. Данное руководство актуально для пользователей ОС Windows, до никсов доберемся потом.

Если раньше в том же C++ Builder 6 статическая и динамическая линковка задавалась просто установкой и снятием галочки в свойствах проекта, здесь все хуже: нам нужно перекомпилировать и пересобрать весь Qt заново.

1. Для удобства ставим еще один Qt, в другую папку, называем так, чтобы не путаться (я добавляю static в название папки)
2. Далее, для пользователей компилятора MinGW:
редактируем файл <QTDIR>\mkspecs\win32-g++\qmake.conf, где <QTDIR> - каталог установки Qt. привожу изменения для разных версий Qt:

4.6 и новее:

Добавляем в QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc строку -static -static-libgcc, получаем:
QMAKE_LFLAGS = -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

от 4.3 до 4.5:

Добавляем в QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc строку -static, получаем:

QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

версии ниже 4.2:

1. Из строки QMAKE_CFLAGS_THREAD = -mthreads удяляем -mthreads

2. Из QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc удаляем -mthreads и добавляем -static, получаем:
QMAKE_LFLAGS = -static -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

Для пользователей MSVS:

Для устранения зависимости от библиотек msvc*.dll.
Так же редактируем файл <QTDIR>\mkspecs\win32-[версия MSVS]\qmake.conf, для каждой версии MSVS - свой:
msvc для Visual Studio 6
msvc.net для Visual Studio.NET 2002-2003
msvc2005 для Visual Studio.NET 2005
msvc2008 для Visual Studio.NET 2008

Меняем QMAKE_CFLAGS_RELEASE = -O2 -MD на QMAKE_CFLAGS_RELEASE = -O2 -MT

Примечание: если параметр равен -O2 -MD -GL, удалите -GL (тестировано на msvc-2008)

Для версий старше 4.3.2 нужно еще в этом же файле:
(тестировано на Visual Studio 2005 и Visual Studio 2008)

заменить
CONFIG += qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe

на

CONFIG += qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target

_____________________________________________________________
С редактированием файлов закончили, переходим к сборке.

3. Сборка.
Открываем консоль Qt Command Prompt того Qt, что для статической линковки (можно и обычную виндовскую - но тогда переменные окружения нужно вручную добавить) и выполняем команды:
для MinGW:

configure -static -release -no-exceptions
(можно еще добавить -nomake-demos -nomake-examples - не собирать примеры и демки, что несколько ускорит процесс, плюс здесь же добавляется поддержка плагинов Qt, но не все плагины доступны для статической линковки в бесплатной версии Qt)

затем:

mingw32-make sub-src


для MSVS:

configure -static -release

затем:

nmake sub-src

и запасаемся терпением или идем пить чай, процесс длится минут 20.

После нормального завершения процесса наш Qt может собирать программы, не зависящие от его библиотек.
4. Редактируем профили Qt.
Заходим в QtCreator (любой из них - профили все-равно общие), открываем проект, заходим в параметры проекта и открываем управлением профилем Qt, там будет список конфигураций, как правило первая - конфигурация AUTO, ее не трогаем (если раньше стоял Qt - там будет еще и список его профилей, при удалении Qt - он реестр за собой не чистит, наглец ))).

Находим конфигурацию, где qmake.exe находится в папке со статическим Qt и как-нибудь обзываем профиль, чтобы нам было понятно для чего он и не путаться в дальнейшем.
Теперь при входе в "обычный" QtCreator мы будем выбирать профиль проекта "динамический", а для статической сборки - наш "статический" профиль.

Добавлено через 14 минут
обратите внимание, что Qt командой configure -static -release сконфигурирован для релиза (Release), для использования в режиме отладки (Debug) необходимо пользоваться configure -static -debug или configure -static -debug-and-release

41
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2011, 00:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll (C++ Qt):

отсутствует libgcc_s_dw2-1.dll - C++ Qt
В общем. Загуглил и нашел, что нужна статическая линковка. Какие-то флаги установить на static и еще что-то. Внятного объяснения не нашел...

Отучение qt 5.0.1 от *.dll - C++ Qt
Вообщем не получается. Читал темы с пометкой ВАЖНО где приведены варианты не работает , линки которые там указаны битые. Я скачал Qt...

Отучение qt 5.0.2 от *.dll - C++ Qt
Читал разные темы, но с qt 5 все несколько иначе. Все делал по статье http://habrahabr.ru/post/137233/ QMAKE_LFLAGS = -static и выполнил ...

Отучение qt 5.1.1 от *.dll - C++ Qt
Да да... знаю. Уже надоели такие темы. Но всё же пишу её, потому как выскочила ошибка, и справиться с ней не выходит: mingw32-make.exe:...

Точка входа в процедуру не найдена в библиотеке DLL MyLib.dll - C++ Qt
Привет! Не думал, что столкнусь с такой проблемой, но все же она меня нашла) Использую вот эту dll...

Как подключить ssleay32.dll & libeay32.dll - C++ Qt
Всем привет. У меня QT5 Собран статически, но без openssl. Как мне сейчас можно поступить, что бы подключить данные длл для передачи...

4
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
05.12.2011, 14:19 #2
По просьбам трудящихся. Сборка статической Qt (MinGW) под винду, с поддержкой OpenSSL:

1. Скачать и установить OpenSSL (для примера в папку Q:\OpenSSL-Win32) (отсюда)
2. Скачать и установить QtSDK (для примера в папку Q:\QtSDK)
3. Скачать исходники Qt http://download.qt.nokia.com/qt/sour...-src-4.7.4.zip и распаковать их в папку (заменить имеющиеся там исходники от установки): Q:\QtSDK\QtSources\4.7.4\
4. Скопировать:
Файлы:
Q:\OpenSSL-Win32\lib\libeay32.lib
Q:\OpenSSL-Win32\lib\ssleay32.lib
в папку:
Q:\QtSDK\QtSources\4.7.4\lib\
Файлы:
Q:\OpenSSL-Win32\lib\MinGW\libeay32.a
Q:\OpenSSL-Win32\lib\MinGW\libeay32.def
Q:\OpenSSL-Win32\lib\MinGW\ssleay32.a
Q:\OpenSSL-Win32\lib\MinGW\ssleay32.def
в папку:
Q:\QtSDK\Desktop\Qt\4.7.4\mingw\lib\
Папку:
Q:\OpenSSL-Win32\include\
в папку:
Q:\QtSDK\QtSources\4.7.4\include
т.е. папка Q:\QtSDK\QtSources\4.7.4\include должна будет содержать в себе подпапку Q:\QtSDK\QtSources\4.7.4\include\openssl
5. Открыть блокнотом файл:
Q:\QtSDK\QtSources\4.7.4\mkspecs\win32-g++\qmake.conf
найти строку, содержащую: QMAKE_LFLAGS
удалить ее полностью, и вместо нее вставить:
QMAKE_LFLAGS = -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
и сохранить файл.
6. Запустить консоль Qt из «Пуск»→«Программы»→«QtSDK»→«Desktop»→«Qt 4.7.4 for Desktop (MinGW)»
В консоли перейти в папку: Q:\QtSDK\QtSources\4.7.4\ с помощью команд:
«Q:» (без кавычек, нажать Enter)
«cd Q:\QtSDK\QtSources\4.7.4\» (без кавычек, нажать Enter)
7. Сконфигурировать исходники Qt командой:
configure -static -debug-and-release -no-exceptions -openssl-linked -nomake demos -nomake examples
Ответить на вопросы по лицензии (лицензия OpenSource)
8. Дождаться конца конфигурирования и собрать библиотеку командой (в той же открытой консоли):
mingw32-make sub-src
и дождаться окончания сборки, после чего консоль можно закрывать.
9. Запустить QtCreator, зайти в меню:
«Инструменты» → «Параметры» и в левом меню выбрать пункт Qt4
Кнопкой «Добавить» - добавить созданную статическую сборку, т. е. указать в открывшемся окне файл: Q:\QtSDK\QtSources\4.7.4\bin\qmake.exe
и дать ей свое имя (к примеру «Qt 4.7.4 for Desktop - MinGW 4.4 (Static)»)

Раскрыть область «Подробнее» и нажать кнопку «Собрать все»
Открыть проект, зайти в его свойства (слева меню «Проекты») и добавить новую конфигурацию сборки с новым именем (из п.13.)
Выбрать тип сборки Релиз (из Релиз или Дебаг)
Можно собирать проекты.
Видео как это делалось: http://narod.ru/disk/start/01.dl14sg...SetupVideo.zip
8
Zeka13
-33 / 8 / 0
Регистрация: 22.03.2012
Сообщений: 135
14.07.2012, 01:46 #3
Вступление:

В данном уроке я расскажу в картинках как собрать приложение статически/провести статическую линковку/ отучить ваш *.exe от библиотек Qt - кажется это всё одно и тоже по своей сути

Пожалуй можно начинать:

Лично я всё проделывай со свеженькой на данный момент Qt SDK с сайта Nokia( Qt 4.8 и SDK 1.2.1)

Шаг 1.

Насколько я сам разобрался для нормальной сборки нам в системе понадобится Perl

Я его брал отсюда http://www.perl.org/

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
Я выбрал версию ActiveState и понятия не имею чем она отличается от Strawberry, но с ним всё работало

Название: h_1342213452_4686071_dfed7da94f.png
Просмотров: 19925

Размер: 9.3 Кб

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

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

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Ура, у нас есть Perl!

Шаг 2.

Теперь можно приступать к сборке Qt из исходников.

Первым делом я предлагаю скачать исходники
я взял эти http://download.qt.nokia.com/qt/sour...-src-4.7.4.zip, возможно и посвежей подойдут, но я рисковать не стал
теперь нужно распаковать это дело в X:\QtSDK\QtSources\4.7.4\
папок QtSources\4.7.4\ у вас не будет, их нужно создать

теперь нам нужно открыть вашим любимым блокнотом файлик
X:\QtSDK\QtSources\4.7.4\mkspecs\win32-g++\qmake.conf
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

найти строку, содержащую текст: QMAKE_LFLAGS
и привести её к такому вот виду:
QMAKE_LFLAGS = -static -static-libgcc -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
и сохранить файл.
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Теперь нам нужно открыть пропатченный терминал(да простят меня виндузятники, если эта штука не так называется), который можно найти у себя, взглянув на мой скриншот
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Теперь в этой терминале нам нужно перейти в каталог
X:\QtSDK\QtSources\4.7.4\

и забить команду
configure -static -debug-and-release -no-exceptions -openssl-linked -nomake demos -nomake examples
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll


затем вам предстоит прочесть всё, что вам предложат прочесть и правильно ответить на вопросы

дождавшись выполнения команды(конца конфигурирования) и появления приглашения строки ввода, забиваем теперь команду(собираем библиотеку)
mingw32-make sub-src

после окончания терминал можно закрыть и проделать следующее
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

после того, как нажмёте "Собрать всё" может вывалится вот такая вот с первого взгляда непонятная штука, её я предлагаю просто закрыть и забыть о ней
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Всё почти готово, осталось открыть свой проект и сделать несколько кликов, как на скринах
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll

Всем спасибо за внимание, надеюсь у вас всё получилось.

Надеюсь данный урок послужит макетом для более тонкой сборки и настройки вашего окружения Qt.
4
Jupiter
20.07.2012, 01:11
  #4
 Комментарий модератора 
Тема закрыта и вычищена. Для вопросов создавайте тему на форуме ссылаясь на эту тему. Для дополнений и предложений так же создавайте тему на форуме и если модератор раздела посчитает нужным, добавит ваш пост в эту тему.
1
minforlife
Заблокирован
16.08.2012, 12:08 #5
В общем, читал 3 пост этой темы, и есть маленькое недоразумение:
Цитата Сообщение от 3-го поста
и забить команду
configure -static -debug-and-release -no-exceptions -openssl-linked -nomake demos -nomake examples
А именно в аргументе -openssl-linked... Необходимо условие - установлен ли OpenSSL (см. 2 пост).
К чему я всё это веду? Дело в том, что если не установлен OpenSSL, то выйдет ошибка при сборке библиотеки (после того, как вы введете команду mingw32-make sub-src).

Поэтому набрать нужно:
configure -static -debug-and-release -no-exceptions -nomake demos -nomake examples

Потом уже mingw32-make sub-src

А после того как наберете mingw32-make sub-src, сборка библиотеки будет длиться 1-3 часа (зависит от производительности вашего процессора)

Спасибо за внимание

Добавлено через 27 минут
Ксати, всё получилось по 3-му посту (не забудьте, что я написал про аргумент -openssl-linked)

Вот скрин GUI-приложения (статическая, релизная версия - 8,40 МБ).
2
Миниатюры
Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll  
Изображения
 
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2012, 12:08
Привет! Вот еще темы с ответами:

Не собираются qsqlmysql.dll и qsqlmysqld.dll под qt 5.1.1 mingw4.8 - C++ Qt
Пользуясь вот этой статьёй http://seppemagiels.com/blog/create-mysql-driver-qt5-windows#mysql_path_note Пытался собрать mysql driver....

Точка входа в не найдена в библиотеке DLL Qt5Core.dll - C++ Qt
Доброго времени суток! бьюсь над проблемой уже 3 день, суть такая: собрал проект на qt 5.3.1. В Debuge он компилится и запускается и...

MinGW версии 4.5.0 содержит libgcc_s_dw2-1.dll без которой ни одна скомпилированная прога не запускается. А как же запускать проги на других машинах? - Кроссплатформенная разработка
То есть установил такой пакет и скомпилил прогу #include &lt;stdio.h&gt; using namespace std; int main() { getchar(); return 0; ...

Eclipse и libgcc_s_dw2-1.dll - Кроссплатформенная разработка
Поставил Eclipse, установил MinGW, выбрал стандартный проект Hello World, при нажатии на Run пишет, что программе не удалось запуститься,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
16.08.2012, 12:08
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru