qt3 на руке: невозможно связать упакованное поле

Я работаю с программным обеспечением, использующим qt3. Он отлично работает в системах x86-linux. Когда я попытался перенести его на Raspberry Pi 2, я получил странную ошибку компилятора. Google не смог мне помочь, и все, что я пробовал, не помогло.

Ошибка:

невозможно связать упакованное поле '((QChar*)this)->QChar::ucs' с 'ushort&{aka short unsigned int&}'

который относится к следующей части qstring.h

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *(&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

Конечно, я уже пытался определить Q_NO_PACKED_REFERENCE, который просто перемещает ошибку на строку выше. Я также попытался явно определить архитектуру, float abi и cpu.

Вот моя среда:

  • ЦП: ARMv7
  • ОС: Убунту 16.04
  • Компилятор: gcc/g++ 4.8.5 (Ubuntu/Linaro 4.8.5-4ubuntu2)
  • Версия Qt: 3.3.8b из здесь (попробовано с x11 и встроенным)

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

Мой вопрос: В чем причина этой ошибки и как ее исправить? (Предпочтительно исправить без изменения заголовочных файлов qt3.)


person Detonar    schedule 16.01.2018    source источник
comment
Возможный дубликат Почему запрещены неконстантные ссылки на битовые поля?   -  person underscore_d    schedule 16.01.2018
comment
См. также redhat.com/archives/fedora-arm/2009- June/msg00004.html о ком-то, кто перешел на ARM и нашел это   -  person underscore_d    schedule 16.01.2018
comment
@underscore_d спасибо, но я это уже нашел. к сожалению, раствор, найденный там, не работает для меня.   -  person Detonar    schedule 16.01.2018
comment
Затем вы можете включить в свой пост то, что вы уже пробовали и не сработали, чтобы люди не тратили время на повторение этого.   -  person underscore_d    schedule 16.01.2018
comment
qt3 слишком широкий. Какая версия Qt вызвала у вас эту проблему? В какой версии это исправлено?   -  person underscore_d    schedule 16.01.2018


Ответы (1)


Эта ошибка странная. Решение, которое я нашел, еще более странное.

Кажется, установки qt3 из https://download.qt.io/archive/qt/3/ содержат файлы заголовков, отличные от пакетов debian из https://launchpad.net/ubuntu/precise/armhf.

После установки qt3 из пакетов debian вместо компиляции исходного кода со страницы qt мой код скомпилировался нормально.

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

Из qt.io

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *(&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

Из панели запуска

class Q_EXPORT QChar {
    ...
#ifdef Q_NO_PACKED_REFERENCE
    ushort &unicode() { return *((ushort*)&ucs); }
#else
    ushort &unicode() { return ucs; } // Throws error
#endif
    ...
}

Кажется, что между обоими наборами заголовков еще больше различий. Если у кого-то еще есть какие-либо проблемы с файлами заголовков qt, это также может быть связано с этими различиями.

person Detonar    schedule 16.01.2018
comment
Ну и какие версии они оба? Конечно, будут различия, если один старше другого. Код здесь выглядит очень хакерским и определяется реализацией (и это я великодушен), поэтому, возможно, им приходится постоянно обновлять свои хаки, чтобы обмануть компиляторы и заставить их делать то, что они хотят. - person underscore_d; 16.01.2018
comment
@underscore_d, судя по имени файла, оба заголовка должны относиться к версии 3.3.8b. Но да, это действительно похоже на реализацию. В конце концов, поведение этого кода зависит от целевой платформы. - person Detonar; 16.01.2018