QT: проблемы с целочисленным делением в Symbian

28 мая 2010 г.

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


Например, следующий код:

void Dialog::on_pushButton_clicked()
{
quint32 res;
quint32 x=15;
quint32 y=3;
res = x/y;
QMessageBox::information(this,"Res",QString::number(res,10),0,0);
}

прекрасно компилируется и работает в эмуляторе, но при попытке запустить его на Nokia N95 получим следующее сообщение:
Исполняемый файл: 7538 2010-09-11T16:46:49 C:\NokiaQtSDK\Symbian\SDK\epoc32\release\gcce\udeb\HabraTest.exe
Пакет: 8148 2010-09-11T16:46:52 C:\MyFiles\HabraTest\HabraTest.sis
Установка приложения на "Nokia N95 USB (COM6)"...
Копирование установочного файла...
Установка приложения...
Запуск приложения...
Не удалось запустить приложение: General OS-related error
Завершено.

Были перепробованы самые разнообразные варианты, связанные с сертификатами, capabilites и разными прошивками. Как выяснилось, все дело в отсутствии в системных библиотеках поддержки функций __aeabi_uidiv и __aeabi_idiv.
Для решения этой проблемы необходимо добавить к проекту файл с именем division.c (расширение должно быть именно “с”, а не “срр”), содержащий следующий код:

#if __GCCE__
#if __SERIES60_30__
extern unsigned int __aeabi_uidivmod(unsigned numerator, unsigned denominator);
int __aeabi_idiv(int numerator, int denominator)
{
int neg_result = (numerator ^ denominator) & 0x80000000;
int result = __aeabi_uidivmod ((numerator < 0) ? -numerator : numerator, (denominator < 0) ? -denominator : denominator);
return neg_result ? -result : result;
}
unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator)
{
return __aeabi_uidivmod (numerator, denominator);
}
#endif // __SERIES60_30__
#endif // __GCCE__

Необходимо проконтролировать, что добавление файла также отражено в файле *.mmp.
Затем выполняем очистку проекта и компилируем заново. В итоге получается:
Исполняемый файл: 7589 2010-09-11T16:57:58 C:\NokiaQtSDK\Symbian\SDK\epoc32\release\gcce\udeb\HabraTest.exe
Пакет: 8212 2010-09-11T16:58:53 C:\MyFiles\HabraTest\HabraTest.sis
Установка приложения на «Nokia N95 USB (COM6)»…
Копирование установочного файла…
Установка приложения…
Запуск приложения…
Приложение выполняется с PID 434.
Завершено.

Все вышесказанное тестировалось на Qt Creator 2.0.0 и Nokia Qt SDK Version 1.0.

Использованные документы:
wiki.forum.nokia.com/index.php/How_to_use_GCCE_4_with_Symbian_SDKs

Теги:
рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики