【问题标题】:Can't use c++17 features using g++ 7.2 in QtCreator无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能
【发布时间】:2018-03-18 13:41:27
【问题描述】:

我最近将 gcc 和 g++ 更新到了 7.2 版。我特别想尝试std::experimental::anystd::variant,我在QtCreator 中使用Qt 5.9.1。

到目前为止,我已经在项目文件中写了这个:

CONFIG += c++17

我已经在正确的地方添加了正确的标题:

#include <variant>
#include <experimental/any>

任何工作都很好,没有问题。但是,当我包含变体头文件时,我收到此错误:

/usr/include/c++/7/bits/c++17_warning.h:32: error: #error This file requires compiler and library support for the ISO C++ 2017 standard. This support must be enabled with the -std=c++17 or -std=gnu++17 compiler options.

#error 此文件需要编译器和库支持 \ ^~~~~

我在项目文件中尝试了很多东西,这里是完整列表:

CONFIG += c++17

&

CONFIG += c++1z

&

QMAKE_CXXFLAGS += -std=c++17

&

QMAKE_CXXFLAGS += -std=c++1z

&

CONFIG += c++17
QMAKE_CXXFLAGS += -std=c++17

&

CONFIG += c++1z
QMAKE_CXXFLAGS += -std=c++1z

&

CONFIG += c++11
CONFIG += c++14
CONFIG += c++17

这是我能想到的所有黑暗中的刺伤。我错过了什么?为什么experimental::any 编译时变体不编译?

我知道我不应该以这种方式同时使用 CONFIG += c++xxQMAKE_CXXFLAGS,但我想我会试一试,因为没有其他方法。对于奖励积分,我还想知道,当我已经为 17 配置时,是否应该添加 14 和 11 的配置调用?

编辑:

这是我的大部分文件名被清除的编译器输出:

18:04:10: Running steps for project AIQt...
18:04:10: Configuration unchanged, skipping qmake step.
18:04:10: Starting: "/usr/bin/make" 
/home/pete/Qt/5.9.1/gcc_64/bin/qmake -o Makefile ../AIQt/AIQt.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
WARNING: Failure to find: ../src/stdafx.h
WARNING: Failure to find: ../src/Csound/csd.h
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_DATAVISUALIZATION_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../AIQt -I. -I../src -I../src/AIBase -I../src/Maths -I../src/Random -isystem /usr/local/include/csound -I../../../../Qt/5.9.1/gcc_64/include -I../../../../Qt/5.9.1/gcc_64/include/QtDataVisualization -I../../../../Qt/5.9.1/gcc_64/include/QtWidgets -I../../../../Qt/5.9.1/gcc_64/include/QtGui -I../../../../Qt/5.9.1/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../../../Qt/5.9.1/gcc_64/mkspecs/linux-g++ -o main.o ../AIQt/main.cpp
In file included from /usr/include/c++/7/variant:35:0,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
/usr/include/c++/7/bits/c++17_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2017 standard. This support must be enabled with the -std=c++17 or -std=gnu++17 compiler options.
 #error This file requires compiler and library support \
  ^~~~~
In file included from ..###,
                 from ..###
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
../src/AIBase/Geno.h:70:18: error: ‘variant’ in namespace ‘std’ does not name a type
             std::variant m_valueVariant;
                  ^~~~~~~
In file included from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###,
                 from ..###:
../src/AIBase/Pheno.h:22:13: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
             const double getGenoValue(size_t genoIndex) const;
             ^~~~~
../src/AIBase/Pheno.h:24:13: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
             const UserRating getRating() const;
             ^~~~~
In file included from ..###,
                 from ..###:
../AIRadioQt/GraphDialog.h:16:15: warning: declaration ‘struct ar::ai::ClusterList’ does not declare anything
 class ar::ai::ClusterList;
               ^~~~~~~~~~~
make: *** [main.o] Error 1
18:04:13: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project AIQt (kit: Qt 5.9.1 GCC 64bit)
The kit Qt 5.9.1 GCC 64bit has configuration issues which might be the root cause for this problem.
When executing step "Make"
18:04:13: Elapsed time: 00:03.

回答:

正如 nwp 所说,我只需要清理并重建它。

另一位发帖人也评论说CONFIG += c++17似乎还不支持,所以有必要使用QMAKE_CXXFLAGS += -std=c++17。不过他很快删除了他的评论,所以我无法亲自感谢他为我检查文档的努力。

【问题讨论】:

  • 在底部应该有一个选项卡“编译输出”。有哪些以“-std=”开头的标志?请注意,它们可能有多个,并且只计算最后一个。
  • 这是一个好点,我没想过要检查。它没有提到 -std= 标志。我需要在特定位置添加 CONFIG 行吗?编译器输出添加到问题...
  • 右键单击您的项目并选择“clean”,然后选择“Run qmake”。由于某些原因,我永远无法理解更改 .pro 文件并不总是能正确更新 makefile。
  • 该死的!只要我使用的是 QMAKE_CXXFLAGS += -std=c++17,而不是 CONFIG 等价物,它在我清理和重建后就可以工作。谢啦!有人确实简短地写了一条评论,说明文档没有显示对 CONFIG += c++17 的支持。他删除了他的评论,但如果他正在阅读这篇文章,那是一件很有帮助的事情。随时再次写该评论,我会支持它,哈哈。但是,是的,重建就是答案,非常感谢 nwp。
  • 不要在问题中包含答案。相反,发布一个答案并接受它。

标签: c++ qt-creator c++17 variant


【解决方案1】:

CONFIG += c++17 可用于 Qt 5.12 及更高版本。

对于 Qt 5.11 和更早的版本,it is not a recognized QMake flag 你必须弄脏你的手。

添加 QMAKE_CXXFLAGS += -std=c++17 可以为 GCC 和 Clang 完成工作;对于 MSVC,您将 probably need to specify /std:c++17/std:c++latest

【讨论】:

  • 这是真的,但实际上是清理并再次构建解决了我的问题,所以任何阅读本文的人,请记住也这样做
  • QtCreator 4.6 和 Qt 5.10 与 CONFIG += c++17QMAKE_CXXFLAGS += -std=c++17,在这里工作。
  • @Alexander 我添加这些时不能使用&lt;filesystem&gt;。你确定它适用于只存在于 C++17 中的东西吗?
  • @Alexander 也许它是特定于构建工具的。对于 MSVC,我必须将第二个更改为 QMAKE_CXXFLAGS += /std:c++17——通过检查显式设置为 c++17 的 VS2017 C++ 项目的构建输出,我得到了格式正确的 MSVC C++17 标志。
  • CONFIG += c++17 在 Windows 10 上使用 64 位 MinGW 7.3.0 的 Qt 5.12.1 无法为我完成工作。但是,QMAKE_CXXFLAGS += -std=c++17 仍然可以完成工作。
【解决方案2】:

对于 Windows: 我正在下载qt-opensource-windows-x86-5.11.1,包含MinGW32。 对于 MinGW64,我下载 qt-5.5.0-x64-mingw510r0-seh-rev0 并仅安装编译器。 配置 QtCreator,如 here 所说。 创建新项目并将 QMAKE_CXXFLAGS += -std=gnu++1z 添加到 .pro 文件 (gcc doc)。 为了测试,尝试编译这个简单的代码:

#include <optional>

std::optional<int> foo() 
{
    return std::nullopt;
}

int main(int argc, char *argv[])
{
    foo();
}

【讨论】:

    【解决方案3】:

    编辑 3/2019:自 Qt 5.12 起,您可以使用 CONFIG += c++17


    实际的标志是c++1z,而不是c++17。简而言之,要获得 C++17 支持,您无需修改​​ QMAKE_CXXFLAGS,而只需使用 CONFIG += c++1z

    关于为什么可以是found in this bug report的讨论,但它几乎相当于“我们在C++17标准化之前将它实现为c++1z,现在我们不会打扰它的别名。”

    注意:我知道你只需要一个干净和重建。我正在回答“我需要使用哪些标志来启用 C++17 支持?”的基本问题

    【讨论】:

    • 不能使用 clang-cl 与 Qt 5.12.4 和 LLVM 8.0.0 一起使用。我不知道如何改用普通的 clang cli。
    • 根据gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html,c++1z 已被弃用。首选c++17
    • @jjcf89 这是给 gcc 的。这些是提供给 QtCreator 的标志,用于确定将哪些标志发送到编译器,无论是 gcc、MSVC 等等。
    • &lt;thumbs_up&gt;我有 Qt 5.11.3 并且“CONFIG += c++1z”有效。创作者版本 4.8.2 &lt;/thumbs_up&gt;
    【解决方案4】:

    通过示例 C++17 C++20 在 Linux 上使用 Qt5 版本 5.15.3(及更高版本)构建(或在 Windows 上类似)

    总结: 在 CMakeLists.txt 文件中,使用 C++17 编写并使用 Qt 的应用程序

    cmake_minimum_required(VERSION 3.16.0)
    project(helloworld VERSION 1.0.0 LANGUAGES CXX)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    

    qt 项目配置,例如 mygame.pro 可能有 c++1z 用于 C++17 或 c++2a 用于 C++20 或 c++11 用于旧项目:

    CONFIG += c++1z
    

    configure的命令行上,例如一个C++20项目配置,总是使用影子构建:

    ../configure -c++std c++2a
    cmake --build .. --parallel
    

    带有或不带有 qt 的 Windows 或 Linux 编译器命令参数示例;在撰写本文时,C++20 是 c++2a,C++17 是 c++1z,其他人将遵循。

    $ g++ -std=c++2a hello_linux_is_the_worlds_device_future.cpp  
    c:\hello> cl /std=c++1z /EHsc hello_windows_is_in_decline.cpp
    

    在 Windows 上注意正向 /slash。

    更多详情: 我发现通过 C++17 或 C++20(Qt6 需要至少 C++17)。我克隆并检查了 qt5 5.15 版本,即所有 qt5 开源并使用 C++20 构建它 - 构建需要 23GB ... 你不需要做所有这些。 p>

    注意下面的配置示例, ... 在快速 PC 上构建 4 小时非常麻烦,但我最终还是成功了。无论如何,关键是 Qt5.15 很乐意使用 C++17 或 C++20 设置(在我的例子中使用 gcc g++-8 或 g++-9)构建自己

    1. 看看这个cmake Get Started (qt6 C++17 example),但 20 个也可以)

    2. qt5开源代码总编译qt5.15.3与C++20配置示例:-

      mkdir qt5-build

      cd qt5-build

      ../configure -release -opensource -nomake 示例 -nomake 测试
      -skip qtdocgallery -c++std c++2a -confirm-license -opengl desktop
      -platform linux-g++-64 # 请把这些都放在一行上。

      cmake --build .. --parallel

    或者像我一样使用 ma​​ke -j4

    为了我自己的笔记,我非常谨慎地写了这篇文章,我很高兴自己进行更正,欢迎提出建议;永远不要侵入作者的作品并改变它!就像我不去公共图书馆并从书中删除页面一样。示例比没有解决方案的次数更多,但是示例老化得更快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 2022-10-07
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多