В поддержку Qt

статьи в помощь разработчику

   

Главная

Статьи:

Выбор инструментов разработки

Установка MinGW

Установка Qt 4

Установка Qt 5

Сборка Qt 5

Установка Qt Creator

Проблемы Qt 4.8.3

Распараллеливание компиляции

Распараллеливание для Qt 5.0.1

Сборка отладчика GDB

Установка библиотеки Qwt

Плагин Qwt

Установка QwtPolar

Установка QwtPplot3D

Изменение палитры цветов QwtPlot3D

Конфигурация сборки по умолчанию

Сборка Qt Creator из исходников

Пример использования QwtPlot

Масштабирование QwtPlot в стиле TChart

Синхронное масштабирование

Пример использования QwtPolar

Пример использования QwtPlot3D

Редактирование QSplitter

Сборка в Ubuntu для Windows

Установка пакетов без интернета

Установка драйвера NVIDIA

Файлы:

Проект с интерфейсом QChartSynZoom

Проект без сплиттера

Исходники класса QChartSynZoom

 

Главная > Проблемы Qt 4.8.3

 

Проблемы релиза Qt 4.8.3

Все, изложенное ниже, относится только к Qt 4.8.3. В релизе Qt 4.8.4 данные проблемы исправлены.

В 2012 году Nokia продала финской IT-компании Digia технологии и все активы, касающиеся Qt. Прочитать сообщение об этом можно, например, здесь. Первоначально к Digia перешло комерческое лицензирование Qt Commercial, а затем и открытое LGPL–лицензирование. В связи с этим релиз библиотеки Qt 4.8.3 производился уже под флагом Digia.

Сменилась страница загрузки продуктов Qt. Процесс установки библиотеки не изменился, с ним можно ознакомиться здесь. При сборке проектов с новой версией библиотеки могут возникнуть проблемы, рассмотрению некоторых из них и посвящена данная статья.

Компиляция файла ресурсов

Если в файле проекта объявлено использование файла ресурсов, например так

RESOURCES += resfile.qrc

то в процессе сборки проекта будет вызван компилятор ресурсов rcc.exe для генерации файла qrc_resfile.cpp, который потом будет скомпонован с приложением

c:\Qt\qt-4.8.2\bin\rcc.exe -name resfile resfile.qrc -o qrc_resfile.cpp

В версии Qt 4.8.2 (и многих других) в команде вызова компилятора ресурсов формируется полный путь к нему, и процесс сборки проекта происходит нормально. В версии Qt 4.8.3 данная команда формируется в виде

bin\rcc.exe -name resfile resfile.qrc -o qrc_resfile.cpp

и сборка проекта завершается ошибкой

process_begin: CreateProcess(NULL, bin\rcc.exe -name resfile resfile.qrc -o qrc_resfile.cpp, ...) failed.
make (e=2): Не удается найти указанный файл.

Оказывается, подобная проблема встречалась и раньше, об этом говорится, например, на форуме, а решение предложено здесь. Чтобы система находила файл rcc.exe в переменной Path прописывается такой путь, после прибавления к которому подкаталога bin, получался бы верный путь к искомому файлу. Итак, кликаем правой кнопкой мыши по значку Мой компьютер, выбираем пункт контекстного меню Свойства, открываем вкладку Дополнительно, нажимаем кнопку Переменные среды, выбираем переменную Path, нажимаем кнопку Изменить и дописываем через точку с запятой следующее

C:\Qt\qt-4.8.3

Закончив редактирование переменной, нужное число раз нажимаем OK. Теперь данная ошибка возникать не должна.

Включение обработки исключений

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

g++ -c -O2 -Wall -Wextra -fno-exceptions -fno-rtti -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -DQT_NO_DYNAMIC_CAST -I"..\..\qt-4.8.3\include\QtCore" -I"..\..\qt-4.8.3\include\QtGui" -I"..\..\qt-4.8.3\include" -I"..\..\qwt-6.0.1\include" -I"..\..\qt-4.8.3\include\ActiveQt" -I"release" -I"." -I"..\..\qt-4.8.3\mkspecs\win32-g++" -o release\mainwindow.o mainwindow.cpp

Параметр -fno-exceptions как раз и свидетельствует об этом. Поэтому если в Вашем коде используется конструкция вида

try {}
catch(...) {}

то сборка проекта завершится ошибкой

error: exception handling disabled, use -fexceptions to enable

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

qmake.exe C:\Qt\qt-proj\project\project.pro -r -spec win32-g++

то при использовании Qt 4.8.3 в командной строке потребуется еще одна опция

qmake.exe C:\Qt\qt-proj\project\project.pro -r -spec win32-g++ CONFIG+=exceptions

Добавление опции может осуществляться в командной строке терминала при вызове qmake, непосредственно в файле проекта project.pro или в настройках проекта так, как показано на рисунке.

Теперь проект соберется успешно, а команда вызова компилятора в консоли сборки будет выглядеть иначе

g++ -c -O2 -fexceptions -mthreads -Wall -Wextra -fno-rtti -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -DQT_NO_DYNAMIC_CAST -I"..\..\qt-4.8.3\include\QtCore" -I"..\..\qt-4.8.3\include\QtGui" -I"..\..\qt-4.8.3\include" -I"..\..\qt-4.8.3\include\ActiveQt" -I"release" -I"." -I"..\..\qt-4.8.3\mkspecs\win32-g++" -o release\mainwindow.o mainwindow.cpp

Параметры -fexceptions и -mthreads свидетельствует о том, что обработка исключений включена.

Включение динамической информации о типах

В C++ существует приведение одного типа к другому вида

dynamic_cast<T *>()

которое использует RTTI (Run-time Type Information). В релизе Qt 4.8.3 по умолчанию поддержка технологии RTTI отключена, об этом свидетельствует параметр -fno-rtti при вызове компилятора в консоли сборки. Поэтому при наличии в коде инструкции dynamic_cast или оператора typeid сборка проекта будет завершаться ошибкой. Для включения поддержки RTTI в командной строке вызова qmake необходима дополнительная опция

CONFIG+=rtti

Если поддержка RTTI включена, в команде вызова компилятора должен присутствовать параметр -frtti.

Некоторые источники утверждают, что RTTI требуется для корректной работы механизма исключений C++. В таком случае при вызове qmake необходимо указывать обе опции

CONFIG+=exceptions CONFIG+=rtti

или так

"CONFIG += exceptions rtti"

Сборка библиотеки

Если в файле проекта присутствует инструкция

TEMPLATE = lib

т.е. конечной целью является библиотека, то для осуществления успешной сборки проекта с библиотекой Qt 4.8.3 при вызове qmake необходимо указывать опцию

CONFIG+=dll

 

В заключение хочется отметить, что хотим мы того или нет, далее Qt будет развиваться с компанией Digia, и панические сообщения типа "Откатываюсь на 4.8.2!" – это не конструктивная реакция.