webentwicklung-frage-antwort-db.com.de

C++ 17-Funktionen können nicht mit g ++ 7.2 in QtCreator verwendet werden

Ich habe kürzlich gcc und g ++ auf Version 7.2 aktualisiert. Ich möchte insbesondere std::experimental::any und std::variant ausprobieren und benutze Qt 5.9.1 in QtCreator.

Bisher habe ich dies in die Projektdatei geschrieben:

CONFIG += c++17

Und ich habe die richtigen Header an den richtigen Stellen hinzugefügt:

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

Alles funktioniert gut, keine Probleme dort. Wenn ich jedoch die Variantenkopfdatei einbezüge, erhalte ich diesen Fehler:

/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 Diese Datei erfordert die Unterstützung von Compiler und Bibliothek\ ^ ~~~~

Ich habe verschiedene Dinge in der Projektdatei ausprobiert, hier ist die vollständige Liste:

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

Das ist jeder Stich in der Dunkelheit, an den ich denken konnte. Was vermisse ich? Und warum wird experimental::any kompiliert, wenn die Variante nicht funktioniert?

Ich weiß, dass ich CONFIG += c++xx und QMAKE_CXXFLAGS nicht auf diese Weise zusammen verwenden sollte, aber ich dachte, ich würde es versuchen, da sonst nichts funktioniert. Für Bonuspunkte frage ich mich auch, sollte ich die CONFIG-Anrufe für 14 und 11 hinzufügen, wenn ich bereits für 17 CONFIG bin?

BEARBEITEN:

Hier ist die Compiler-Ausgabe mit den meisten meiner Dateinamen, die gelöscht wurden:

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.

ANTWORTEN:

Wie von nwp erwähnt, musste ich es einfach reinigen und neu aufbauen.

Ein anderes Poster kommentierte auch, dass CONFIG += c++17 noch nicht unterstützt wird, so dass QMAKE_CXXFLAGS += -std=c++17 verwendet werden muss. Er löschte seinen Kommentar jedoch schnell, daher kann ich ihm nicht persönlich danken, dass er sich die Mühe gemacht hat, die Unterlagen für mich zu überprüfen.

15
Iron Attorney

Seit Qt 5.11 ist CONFIG += c++17immer noch kein erkanntes QMake-Flag . (Updated: es ist seit Qt 5.12 anerkannt)

Hinzufügen von QMAKE_CXXFLAGS += -std=c++17 erledigt den Job für GCC & Clang; Für MSVC werden Sie müssen wahrscheinlich angeben/std:c++17 oder /std:c++latest.

15
minexew

Das eigentliche Flag ist c++1z, nicht c++17. Um die Unterstützung für C++ 17 zu erhalten, müssen Sie QMAKE_CXXFLAGS nicht ändern und können stattdessen einfach CONFIG += c++1z verwenden.

Die Diskussion über den Grund, warum in diesem Fehlerbericht gefunden werden kann, ist ziemlich groß, "wir haben es als c++1z implementiert, bevor C++ 17 standardisiert war, und wir wollen uns jetzt nicht mehr mit Aliasing beschäftigen."

Hinweis: Mir ist klar, dass Sie gerade einen sauberen und neuen Aufbau benötigten. Ich beantworte die zugrunde liegende Frage "Welche Flags muss ich verwenden, um die Unterstützung von C++ 17 zu aktivieren?"

7
Jon Harper

Für Windows: Ich bin der Download von qt-opensource-windows-x86-5.11.1, einschließlich MinGW32 . Für MinGW64 bin ich qt-5.5.0-x64-mingw510r0- seh-rev0 und installieren Sie nur den Compiler . Konfigurieren Sie QtCreator wie hier hier . Erstellen Sie ein neues Projekt, und fügen Sie der .pro-Datei QMAKE_CXXFLAGS + = -std = gnu ++ 1z hinzu ( gcc doc ) . Versuchen Sie zum Testen diesen einfachen Code:

#include <optional>

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

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