【问题标题】:Unable to cross-compile Qt 5.14.2 for Raspberry PI zero w because it “requires a C++11 compiler”无法为 Raspberry PI zero w 交叉编译 Qt 5.14.2,因为它“需要 C++11 编译器”
【发布时间】:2020-11-27 04:50:13
【问题描述】:

以前版本的 Qt5 已经遇到过这个问题:Stack-overflow post (尚未回答)。我在使用更新的版本时遇到了同样的问题,并且我已经在线学习了几个教程:

即使所有这些教程都已过时,交叉编译 Qt5 的方法仍保持不变。我的目标板是运行 Raspbian Buster 的 Raspberry pi zero w。配置步骤运行良好(没有任何错误)。

我在执行 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

【问题讨论】:

  • 你用的是什么编译器? - 对我来说看起来像一个 Windows 系统。是MSVS吗?还是明格? - 你能看到版本吗?您可能需要在 .pro 文件中指定 c++11 标志 CONFIG += c++11...
  • @code_fodder 主机 pc 正在运行 ubuntu 20.04,我正在为 ARM 使用 gcc,因为我正在为 Rpi 进行交叉编译。我不太明白你在编译 qt 本身时将 CONFIG += c++11 添加到 .pro 文件的意思。
  • 能否请您更具体地了解您使用的编译器?你用的是哪个版本?发布您用于构建的命令可能会有所帮助,从而导致此错误。
  • @3.141592 我正在使用github.com/raspberrypi/tools 提供的gcc-arm-linux-gnueabihf 工具包(最新版本)。当我运行 make 命令时产生了错误

标签: c++ compilation raspberry-pi qt5 cross-compiling


【解决方案1】:

对于未来的读者,正如指出的那样,https://github.com/raspberrypi/tools 提供的交叉编译器已过时,无法使用。我已经尝试了上述所有方法,但开箱即用的方法(对于基于旧 ARMv6 架构的 Raspberry Pi 0 W)是:https://github.com/Pro/raspi-toolchain 这个 repo 提供了一个 Docker 镜像,它可以从源代码编译一个更新的工具链,甚至提供一个测试代码,您可以使用生成的工具链交叉编译并在 pi 上执行。

【讨论】:

    【解决方案2】:

    您使用的编译器太旧了。您从共享的链接获得的版本是 4.8.3,而您至少需要 gcc 5。(在此处查看:https://codereview.qt-project.org/c/qt/qtdoc/+/288825

    您得到的错误可能有点误导,因为 gcc 本身声明它完全支持从 4.8.1 开始的 C++11,如下所述:https://gcc.gnu.org/projects/cxx-status.html#cxx11

    我建议你使用更新版本的 gcc。如 qt-docs 中所述,它至少应为 gcc 版本 5 或更高版本。

    有几种方法供您选择(从简单到复杂排序):

    1. 尝试使用系统的包管理器(例如 sudo apt install gcc-arm-linux-gnueabihf)
    2. 在其他地方下载一个。 (例如这里:https://toolchains.bootlin.com/
    3. 构建您自己的。 (也许使用 crosstool-ng)。但请注意!这可能很棘手。尽管我在使用 crosstool-ng 或类似工具方面有很好的经验。

    最后但同样重要的是,不要忘记更改 ./configure 步骤的设置!精确定位您尝试使用的新工具链。

    亲切的问候

    【讨论】:

    • 感谢您的建议,我将使用 crosstool-ng,因为它已经有 pi 零 arnv6 目标的示例构建配方
    • 如果您需要任何进一步的帮助,请告诉我。如果您对答案感到满意,请考虑将其标记为“解决方案”:) 谢谢和问候
    【解决方案3】:

    我遇到了同样的问题。

    我最终通过以下操作正确交叉编译了仅支持 EGL 的 Qt 5.15.0(以避免在如此小的 Rpi 零上使用 X11):

    1- 根据@glamis 的建议,我通过 v1.0.1 中的预构建工具链使用了来自:https://github.com/Pro/raspi-toolchain 的编译工具链

    2-(糟糕)在 Qt 源代码 qtdeclarative/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp 中被黑:我用硬编码值 4096 替换了常量 PATH_MAX(此工具链中不存在?)

    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 -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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多