Проблемы релиза 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!" это не конструктивная реакция.
|