Невозможно выполнить кросс-компиляцию Qt 5.14.2 для Raspberry PI zero w, потому что «требуется компилятор C ++ 11» - PullRequest
1 голос
/ 07 августа 2020

Эта проблема уже встречалась в предыдущих версиях Qt5: Сообщение о переполнении стека (пока нет ответа). У меня такая же проблема с более новой версией, и я следил за несколькими онлайн-руководствами:

Даже если все эти руководства устарели, методология кросс-компиляции Qt5 остается той же. Моя целевая плата - Raspberry pi zero с запущенным Raspbian Buster. Шаги настройки прошли нормально (ошибок не было).

При выполнении make возникают следующие ошибки:

~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:61:4: error: #error "Qt requires C++11 support"
 #  error "Qt requires C++11 support"
    ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:94:13: error: ‘QAtomicOps’ does not name a type
     typedef QAtomicOps<T> Ops;
             ^
In file included from ~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/qglobal.h:1:0,
                 from ~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/src/corelib/global/qt_pch.h:56:
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:97:23: error: ‘QAtomicOpsSupport’ was not declared in this scope
     Q_STATIC_ASSERT_X(QAtomicOpsSupport<sizeof(T)>::IsSupported, "template parameter is an integral of a size not supported on this platform");
                       ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/global/qglobal.h:121:68: note: in definition of macro ‘Q_STATIC_ASSERT_X’
 #  define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
                                                                    ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:97:51: error: ‘::IsSupported’ has not been declared
     Q_STATIC_ASSERT_X(QAtomicOpsSupport<sizeof(T)>::IsSupported, "template parameter is an integral of a size not supported on this platform");
                                                   ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/global/qglobal.h:121:68: note: in definition of macro ‘Q_STATIC_ASSERT_X’
 #  define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
                                                                    ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/global/qglobal.h:121:49: error: non-constant condition for static assertion
 #  define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
                                                 ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:97:5: note: in expansion of macro ‘Q_STATIC_ASSERT_X’
     Q_STATIC_ASSERT_X(QAtomicOpsSupport<sizeof(T)>::IsSupported, "template parameter is an integral of a size not supported on this platform");
     ^
~/Documents/Raspbian/raspi/qt-everywhere-src-5.14.2/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:97: confused by earlier errors, bailing out
make[3]: *** [Makefile:1836: .pch/Qt5Core.gch/c++] Error 1
make[3]: Leaving directory '~/Documents/Raspbian/raspi/qt5build/qtbase/src/corelib'
make[2]: *** [Makefile:228: sub-corelib-make_first] Error 2
make[2]: Leaving directory '~/Documents/Raspbian/raspi/qt5build/qtbase/src'
make[1]: *** [Makefile:51: sub-src-make_first] Error 2
make[1]: Leaving directory '~/Documents/Raspbian/raspi/qt5build/qtbase'
make: *** [Makefile:88: module-qtbase-make_first] Error 2

Ответы [ 3 ]

2 голосов
/ 10 августа 2020

Для будущих читателей, как было указано, кросс-компилятор, предоставляемый: https://github.com/raspberrypi/tools, устарел и не может быть использован. Я пробовал все методы, описанные выше, но тот, который работал «из коробки» (для Raspberry Pi 0 W, основанного на более старой архитектуре ARMv6): https://github.com/Pro/raspi-toolchain Это репо предоставляет Docker изображение, которое компилирует новую инструментальную цепочку из источника и даже предоставляет тестовый код, который вы можете кросс-компилировать с помощью сгенерированной инструментальной цепочки и выполнять на пи.

1 голос
/ 20 августа 2020

У меня была такая же проблема.

В итоге я получил правильную кросс-компиляцию Qt 5.15.0 только с поддержкой EGL (чтобы избежать использования X11 на таком крошечном нулевом Rpi) со следующими действиями:

1- Как было предложено @glamis, я использовал цепочку инструментов компиляции из: https://github.com/Pro/raspi-toolchain через предварительно созданную цепочку инструментов в выпуске v1.0.1

2- (дерьмо) взломано в источниках Qt qtdeclarative/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp: я заменил константу PATH_MAX (отсутствует в этой инструментальной цепочке?) на жестко заданное значение 4096

3- все еще в источниках Qt, отредактируйте файл qtbase/mkspecs/devices/linux-rasp-pi-g++/qmake.conf

3.a) заменить все вхождения -lEGL -lGLESv2 -lOpenVG на -lbrcmEGL -lbrcmGLESv2 -lbrcmOpenVG

3.b) переместить QMAKE_LIBS_OPENGL_ES2 = -lbrcmGLESv2 -lbrcmEGL за пределы оператора if для принудительного использования во всех случаях

примечания:

  • raspberry pi zero, с версией «Raspberry Pi OS Lite» (также известной как raspbian Lite), основанной на debian buster, версия 2020-05-27

  • установленных зависимостей: apt install build-essential libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev libgbm-dev libraspberrypi-dev libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0

  • использован архив qt: qt-everywhere-src-5.15.0.tar.xz

  • мо configure выглядит так: configure -release -opensource -confirm-license -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=/opt/cross-pi-gcc/bin/arm-linux-gnueabihf- -sysroot $HOME/rpi/rootfs -prefix /usr/local/qt-5.15.0-rpi -extprefix $HOME/rpi/qt-5.15.0-rpi -hostprefix $HOME/rpi/tools -make libs -no-use-gold-linker -skip qtwayland -skip qtlocation -skip qtscript -v -no-gbm -ssl

1 голос
/ 09 августа 2020

Компилятор, который вы используете, слишком стар. Версия, которую вы получаете по ссылке, которой вы поделились, - 4.8.3, тогда как вам понадобится как минимум g cc 5. (Отметьте здесь: https://codereview.qt-project.org/c/qt/qtdoc/+/288825)

Ошибка, которую вы получаете, может немного вводить в заблуждение, поскольку сам g cc заявляет, что он полностью поддерживает C ++ 11 из 4.8.1, как указано здесь: https://gcc.gnu.org/projects/cxx-status.html#cxx11

Я предлагаю вам используйте более свежую версию g cc. Как упоминалось в qt-docs, он должен быть не ниже g cc версии 5 или выше.

Есть несколько способов выбрать один (от простого к более сложному):

  1. Попробуйте использовать менеджер пакетов вашей системы (например, sudo apt install g cc -arm- linux -gnueabihf)
  2. Загрузите его где-нибудь в другом месте. (например, здесь: https://toolchains.bootlin.com/)
  3. Создайте свой собственный. (возможно, используйте crossstool-ng). Но имейте в виду! это может быть сложно. хотя у меня есть хороший опыт использования crossstool-ng или подобных инструментов.

И последнее, но не менее важное: не забудьте изменить настройку вашего шага ./configure! Определите новую цепочку инструментов, которую вы пытаетесь использовать.

С уважением

...