Невозможно использовать функции С++ 17 с помощью g++ 7.2 в QtCreator

Недавно я обновил gcc и g++ до версии 7.2. Я хотел бы попробовать std::experimental::any и std::variant в частности, и я использую Qt 5.9.1 в QtCreator.

До сих пор я написал это в файле проекта:

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++xx и QMAKE_CXXFLAGS вместе таким образом, но я думал, что отдам его, поскольку ничего не работает. Для бонусных очков мне также интересно, следует ли добавлять CONFIG звонки на 14 и 11, когда я уже КОНФИГ на 17?

EDIT:

Вот вывод компилятора с большинством моих имен файлов:

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. Однако он быстро удалил свой комментарий, поэтому я не могу лично поблагодарить его за то, что он пытался проверить документы для меня.

Ответ 1

CONFIG += c++17 может использоваться с Qt 5.12 и более поздними версиями.

Для Qt 5.11 и более ранних версий это не распознанный флаг QMake, и вам нужно немного испачкать руки.

Добавление QMAKE_CXXFLAGS += -std=c++17 делает работу для GCC & Clang; для MSVC вам, вероятно, потребуется указать /std:c++17 или /std:c++latest.

Ответ 2

Изменить 3/2019: вы можете использовать CONFIG += c++17 начиная с Qt 5.12.


Фактический флаг - это c++1z, а не c++17. Короче говоря, чтобы получить поддержку С++ 17, вам не нужно изменять QMAKE_CXXFLAGS и вместо этого вы можете просто использовать CONFIG += c++1z.

Обсуждение причин, по которым можно найти этот отчет об ошибке, но в значительной степени это означает, что "мы реализовали его как c++1z до того, как С++ 17 был стандартизирован, и теперь мы не будем его называть".

Примечание: я понимаю, что вы просто нуждались в чистоте и восстановлении. Я отвечаю на основной вопрос "какие флаги мне нужно использовать, чтобы включить поддержку С++ 17?"

Ответ 3

Для Windows: я загружаю qt-opensource-windows-x86-5.11.1, включая MinGW32. Для MinGW64 я загружаю qt-5.5.0-x64-mingw510r0-seh-rev0 и устанавливаю только компилятор. Настройте QtCreator, как сказано здесь. Создайте новый проект и добавьте QMAKE_CXXFLAGS + = -std = gnu ++ 1z в файл .pro(gcc doc). Для теста попробуйте скомпилировать этот простой код:

#include <optional>

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

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