crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Qt SDK 4.5 - перекомпиляция
bps-plus
  опции профиля:
сообщение 8.7.2009, 14:40
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 8.7.2009
Пользователь №: 886

Спасибо сказали: 0 раз(а)




Репутация:   0  


На написание этой небольшой топика меня подтолкнуло первое, не совсем приятное знакомство с Qt. В совокупности с просмотром демок и прочтением нескольких статеек, некоторые проблемы связанные с конфигурированием библиотеки создали смешенное чувство радости и разочарования. Чтобы хоть как-то сгладить неприятные впечатления у новичков я опишу процесс перекомпиляции Qt и решение некоторых проблем связанных с этим.
Для начала хочется отметить что всё нижеперечисленное делалось с Qt SDK 4.5 (2009.01) и на операционной системе WindowsXP Sp3, и делалось при помощи компилятора MinGW, идущего вместе с SDK.
Итак, первое: зачем это надо? Если вы в первый раз сели за сборку простейшего приложения то наверняка столкнулись с проблемой когда ваш свежесобранный проект при попытке его запуска выдаёт примерно следующее сообщение:
qt1.exe - Не удалось найти компонент
Приложению не удалось запуститься, поскольку mingwm10.dll не был найден. Повторная установка приложения может исправить эту проблему.
Это связанно с тем что программа, сама по себе имея весьма скромный размер, требует целую коллекцию внешних библиотек. Есть два решения: либо распространять программу вместе с ними, либо компилировать проект статически. Казалось бы – никаких проблем: настроил проект и перекомпилировал, некоторые источники даже советуют в файле <…>.pro написать строчку
CONFIG += static
Только вот это не работает =)
Как выяснилось скомпилировать проект статически возможно только после полной перекомпиляции в режиме статической линковки всей библиотеки Qt.
Как нам это сделать? Для начала надо подправить файлик "…qt\mkspecs\win32-g++\qmake.conf". Там в строки "QMAKE_LFLAGS" и "QMAKE_LFLAGS_DLL" после "=" надо поставить параметр "-static".
Далее работать надо в консоли, но чтобы с этим не заморачиваться мы напишем всё в bat-файлах. Один из них должен лежать в "…qt\bin", назовём его qtv.bat. Содержать он должен следующее:
CODE
set QTDIR=<QTDIR>
set PATH=<QTDIR>\bin
set PATH=%PATH%;<MINGWDIR>\bin
set PATH=%PATH%;%SystemRoot%\System32
set QMAKESPEC=win32-g++

<QTDIR> здесь - путь к папке Qt. (у меня например D:\Qt\qt)
< MINGWDIR > - путь к папке MinGW. (у меня например D:\Qt\mingw)
Можно при желании не создавать новый файл, а просто изменить qtvars.bat уже лежащий в папке "…qt\bin".
Этот bat-файл настраивает переменные окружения для последующих конфигурации и компиляции Qt.
Следующий batник должен лежать в папке <QTDIR>. Назовём его хотя бы qtcompil.bat. Содержание его должно быть примерно следующее:
CODE
call bin\qtv.bat

configure -static -debug-and-release -no-exceptions -no-qt3support -qt-gif -qt-libpng -qt-libjpeg -no-phonon -no-webkit -no-phonon-backend -platform win32-g++

mingw32-make -j 3

pause


Тут я остановлюсь подробнее.
Строчка "call bin\qtv.bat" вызывает наш батник с переменными окружения.
Команда "configure" конфигурирует Qt перед компиляцией. Параметры:
"-static" – указывает что компилировать будем с поддержкой статической линковки библиотек (то что нам и нужно).
"-debug-and-release" – указывает на то, что мы компилируем библиотеки и для debug, и для release-компиляции наших программ.
" -no-exceptions" – многие источники говорят, что этот параметр необходим для того чтобы была возможность статической компиляции проектов. Отключает библиотеку которая помогает отслеживать эксепшены в тредах. Честно говоря, я не очень понимаю почему именно эта библиотека будет линковаться динамически когда все остальные будут линковаться статически, но на всякий случай его поставил. Результат при его отсутствии не проверял.
"-no-qt3support" – отключает поддержку Qt3. Просто мне не нужно =)
"-qt-gif -qt-libpng -qt-libjpeg" – поддержка библиотек для работы с изображениями. Похоже по умолчанию они отключены.
"-no-phonon -no-webkit -no-phonon-backend" – отключает phonon и webkit. Читал гдето что статическая компиляция этих библиотек запрещена лицензией.
"-platform win32-g++" – указывает на платформу для компиляции. Задаётся в переменных окружения, поэтому, скорее всего его можно опустить.
Команда "mingw32-make" запускает компиляцию библиотеки. В некоторых источниках пишут команду "make", что в нашем случае без разницы, т. к. в "…qt\bin" лежит файл "make.bat" который вызывает тот же "mingw32-make".
Параметр "-j 3" по идее должен распараллеливать компиляцию на 3 потока(у меня 4-х ядерный проц), но лично я разницы не заметил.
Команда "pause" (если вдруг кто-то не знает) позволяет кинуть последний взгляд на окно консоли, дабы убедиться что все команды завершены успешно =).

Казалось бы всё готово, но если мы запустим qtcompil.bat то получим сообщение типа:
Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0/qt\mkspecs

Решается проблема добавлением в "…qt\bin" файла qt.conf со следующим содержанием:
CODE
[Paths]
Prefix = <QTDIR>
Documentation = doc
Headers = include
Libraries = lib
Binaries = bin
Plugins = plugins
Data = .
Translations = translations
Settings = .
Examples = .
Demos = .


Не забудьте заменить <QTDIR> на путь к вашей папке Qt =).
У меня нет никаких идей по тому зачем нужен этот файл, почему он должен быть в этой папке и почему его там нет. Но это работает =)
Теперь можем запускать qtcompil.bat и идти варить пельмени, потому что компиляция может занять от 4-х до 6-ти часов. =) И ещё следует обратить на память. В перекомпилированном виде весь SDK будет весить порядка 19 гигов. Чтобы скосить лишние гигабайты после компиляции можно удалить папки " …qt\demos " и "…qt\examples ". Всё равно QtDemo после перекомпиляции сдыхает. После этого SDK будет весить "всего" 4.6 Гб =)
Если вдруг после перекомпиляции Qt вы при сборке проэкта получаете примерно такую ошибку:
D:\Qt\mingw\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot find -lQtGuid
collect2: ld returned 1 exit status
значит что-то не докомпилировалось. Ещё такое бывает, если при перекомпиляции Qt в configure установить ключ "-release", а компилировать проект в debug, или наоборот.

Вот, в общем то и всё. Теперь вопросы:
Действительно ли для того чтобы "научить" Qt собирать программы со статическим включением библиотек нужна полная перекомпиляция SDK?
Можно ли как-нибудь для этого перекомпилировать только часть SDK? Потому, что ни один из тех параметров что я использовал в mingw32-make, и который по информации из других источников должен был перекомпилировать только основные части SDK не сработал. Можно ли как-нибудь ещё сократить время компиляции? Как работает параметр –j? Можно ли сделать так, чтобы при компиляции проекта под релизом библиотеки линковались статически, а под дебагом – динамически? Можно ли использовать при линковке проекта только часть библиотек, а ненужные исключить?
Буду благодарен за любую информацию, заранее спасибо =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 13:36