当前位置:   article > 正文

Qt调试问题记录(持续更新)_error: c++11 is required and is missing o

error: c++11 is required and is missing or failed to compile.

前言

本人调试Qt所遇到的问题均会记录在此,方便回溯。

调试平台

  • Qt版本:5.12.11
  • Host PC:Ubuntu-20.04
  • Target:ARM/ARM64

调试记录

configure报C++11缺失

这是在交叉编译arm平台执行初始configure时遇到的,用的arm-gcc版本为5.3.1。具体错误如下:

ERROR: C++11 <random> is required and is missing or failed to compile

但当前使用的arm-gcc确认是支持c++11的,解决方式如下:

---------- 修改 qtbase/mkspecs/<your platform>/qmake.conf,添加:
QMAKE_CXXFLAGS += -std=c++11

CONFIG += c++11

再重新configure。亲测两种修改方式均有效,至于是否有差别暂未深入研究。

g++编译选项不支持

arm-linux-gnueabi-g++: error: unrecognized command line option ‘-Wshift-overflow=2’
arm-linux-gnueabi-g++: error: unrecognized command line option ‘-Wduplicated-cond’

这是在交叉编译arm平台时遇到的,用的arm-gcc版本为5.3.1,此版本的gcc的确不支持上述两个编译选项。由于本人并没有指定上述两个选项,因此在Qt Src中全局搜索,发现在如下文件中有描述:

---------- qtbase/mkspecs/features/qt_common.prf

93 } else: gcc:!intel_icc {
94 QMAKE_CXXFLAGS_WARN_ON += -Wvla
95 # GCC 5 fixed -Wmissing-field-initializers for when there are no initializers
96 lessThan(QT_GCC_MAJOR_VERSION, 5): QMAKE_CXXFLAGS_WARN_ON += -Wno-missing-field-initializers
97 # GCC 5 introduced -Wdate-time
98 greaterThan(QT_GCC_MAJOR_VERSION, 4): QMAKE_CXXFLAGS_WARN_ON += -Wdate-time
99 # GCC 6 introduced these
100 greaterThan(QT_GCC_MAJOR_VERSION, 5): QMAKE_CXXFLAGS_WARN_ON += -Wshift-overflow=2 -Wduplicat ed-cond
101 # GCC 7 has a lot of false positives relating to this, so disable completely
102 greaterThan(QT_GCC_MAJOR_VERSION, 6): QMAKE_CXXFLAGS_WARN_ON += -Wno-stringop-overflow
103 # GCC 9 has a lot of false positives relating to this, so disable completely
104 greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-copy
105 # GCC 9 introduced this
106 greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-redundant-move
107 # GCC 9 introduced this
108 greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-format-overflow
109 # GCC 9 introduced this
110 greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-init-list-lifetime

由此可见,Qt本身也有判断,在gcc版本大于6时才会启用上述编译选项,那么为什么在我的环境中,gcc版本是5,也会包含上述选项呢?继续排查,全局搜索QT_GCC_MAJOR_VERSION发现:

---------- qtbase/mkspecs/qconfig.pri
13 QT_CONFIG += shared rpath release c++11 c++14 concurrent dbus no-pkg-config reduce_exports stl
14 QT_VERSION = 5.12.11
15 QT_MAJOR_VERSION = 5
16 QT_MINOR_VERSION = 12
17 QT_PATCH_VERSION = 11
18 QT_GCC_MAJOR_VERSION = 9
19 QT_GCC_MINOR_VERSION = 3
20 QT_GCC_PATCH_VERSION = 0
21 QT_EDITION = OpenSource

在Qt配置文件里的gcc版本居然是9.3.0,猜测是之前在同样的源码目录中使用过gcc-9.3.0交叉编译工具链进行开发,尝试执行如下clean操作:

make distclean
rm qtbase/bin/qmake

重新 configure,但未能解决,gcc版本始终无法更新至当前使用的版本(5.3.1),最终只能重新解压一份全新的源码进行操作,即可解决。
目前原因不明,有了解根因的大哥麻烦留言指点一二,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/260992
推荐阅读
相关标签
  

闽ICP备14008679号