Qt SDK 4.5 - перекомпиляция |
Здравствуйте, гость ( Вход | Регистрация )
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? Можно ли сделать так, чтобы при компиляции проекта под релизом библиотеки линковались статически, а под дебагом – динамически? Можно ли использовать при линковке проекта только часть библиотек, а ненужные исключить? Буду благодарен за любую информацию, заранее спасибо =) |
|
|
Litkevich Yuriy |
8.7.2009, 15:35
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
bps-plus, по поводу сборки Qt написано не мало, начать хотя бы отсюда
|
|
|
bps-plus |
9.7.2009, 10:52
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 8.7.2009 Пользователь №: 886 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спору нет, написано немало... Но чесно говоря во многих случаях информация неполная, пришлось собирать по частям. Захотелось всё сложить в один такой мини-мануал =). К тому же ни на один из своих вопросов я ответ не находил, собственно почему их и озвучил.
|
|
|
Litkevich Yuriy |
9.7.2009, 14:18
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Litkevich Yuriy |
16.11.2009, 23:52
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
тему разделил: проблема компиляции под Visual Studio 2008
Ещё раз перечитал первое сообщение, моё резюме: Не рекомендуется к употреблению. |
|
|
Текстовая версия | Сейчас: 28.11.2024, 16:58 |