Неизвестный модуль в файле .pro - невозможно создать приложение с включенным модулем androidextras

Я работаю над некоторым приложением Qt/QML, которое будет развернуто в ОС Android. Теперь мне нужен модуль androidextras, но если я поставлю androidextras внутри моего файла .pro следующим образом

QT += qml quick widgets sql core bluetooth printsupport androidextras

и я перезагрузился qmake, я получаю следующую ошибку:

Project ERROR: Неизвестный модуль в QT: androidextras

Я также попытался открыть и запустить пример проекта Qt Notifier, но та же ошибка возникает, поэтому я не могу создать ни мое приложение, ни пример, который должен был работать из коробки.

Я использую KUbuntu 15.04 с компилятором gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu13) и Desktop Qt 5.5.0 GCC 64bit Qt. Как создать этот модуль androidextras? У меня есть набор Android arm v7, который вы можете видеть из снимка экрана Maintenance Tool:

Я перекомпилировал весь Qt с помощью clear && ./configure -opensource -confirm-license -verbose -cups -plugin-sql-mysql -android-sdk /opt/android-sdk-linux -android-ndk /opt/android-ndk-r10d && make && make install, настроил Qt и Qt Kit в QtCreator, изменен набор сборки и все та же ошибка появляется. Почему?

1 ответ

Модули Extras предназначены для предоставления дополнительных функций, специфичных для определенной платформы, и, таким образом, доступны только на этой платформе. Это может быть поддержка номера значка в приложениях iOS, поддержка списков переходов Windows или некоторых функций утилиты для преобразования из типа в соответствующий родной тип платформы (например, от QPixmap до CGImageRef, снова в настройках Mac).

Существует четыре дополнительных модуля - Win, Mac/iOS, X11, Android - и пока вы компилируете конкретную выбранную платформу против конкретного набора, все в порядке. И это также автоматически, для среды рабочего стола: ваш хост-компьютер всегда является вашей целевой машиной.

Мобильные комплекты вместо этого используются для перекрестной компиляции с определенного (настольного) хост-компьютера на другую (мобильную) целевую машину. В этих настройках вы можете легко (и ошибочно) скомпилировать код конкретной платформы с неправильным набором.

Вообще говоря, вы должны поместить определенные модули/код платформы в условные выражения, чтобы убедиться, что они скомпилированы только для конкретного набора, для которого они доступны. Это особенно актуально для программного обеспечения, которое должно быть скомпилировано как для настольных, так и для мобильных платформ или на разных платформах для настольных компьютеров. Условный в .pro файл может выглядеть следующим образом:

android: QT += androidextras
mac: QT += macextras
// ...other platform specific and platform independent settings

См. этот ответ для файла примера android .pro, который включает также определенные конкретные настройки.

Такой же подход должен выполняться в коде, т.е. проверять ОС и условно компилировать код платформы. Например, многоплатформенная реализация функции может выглядеть так:

if defined(Q_OS_ANDROID)
#include <qtandroid>
#include <qandroidjniobject>
#endif
// other code...
void YourClass::function()
{
#if defined(Q_OS_ANDROID)
// platform code
#elif defined(Q_OS_WIN)
#endif
} 
</qandroidjniobject></qtandroid>

См. например этот ответ для полного примера Android или этот другой ответ для некоторых полезных спецификаций iOS ключевые слова.

licensed under cc by-sa 3.0 with attribution.