J'ai récemment mis à jour gcc et g ++ vers la version 7.2. Je voudrais essayer en particulier std::experimental::any
et std::variant
, et j'utilise Qt 5.9.1 dans QtCreator.
Jusqu'à présent, j'ai écrit ceci dans le fichier de projet:
CONFIG += c++17
Et j'ai ajouté les bons en-têtes aux bons endroits:
#include <variant>
#include <experimental/any>
Tout fonctionne bien, pas de problèmes là-bas. Cependant, lorsque j'inclus le fichier d'en-tête de variante, j'obtiens cette erreur:
/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 Ce fichier nécessite le support du compilateur et de la bibliothèque\ ^ ~~~~
J'ai essayé une variété de choses dans le fichier de projet, voici la liste complète:
CONFIG += c++17
Et
CONFIG += c++1z
Et
QMAKE_CXXFLAGS += -std=c++17
Et
QMAKE_CXXFLAGS += -std=c++1z
Et
CONFIG += c++17
QMAKE_CXXFLAGS += -std=c++17
Et
CONFIG += c++1z
QMAKE_CXXFLAGS += -std=c++1z
Et
CONFIG += c++11
CONFIG += c++14
CONFIG += c++17
C'est tout ce que je peux imaginer. Qu'est-ce que je rate? Et pourquoi experimental::any
compile-t-il lorsque la variante ne le fait pas?
Je sais que je ne devrais pas utiliser CONFIG += c++xx
et QMAKE_CXXFLAGS
ensemble de cette façon, mais je pensais que je pouvais tenter ma chance, car rien d'autre ne fonctionne. Pour les points bonus, je me demande aussi si je devrais ajouter les appels CONFIG pour 14 et 11 alors que je config déjà pour 17?
MODIFIER:
Voici la sortie du compilateur avec la plupart de mes noms de fichiers nettoyés:
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.
RÉPONSE:
Comme mentionné par nwp, il me suffisait de le nettoyer et de le reconstruire.
Une autre affiche a également fait remarquer que CONFIG += c++17
ne semble pas encore pris en charge. Il est donc nécessaire d’utiliser QMAKE_CXXFLAGS += -std=c++17
. Il a cependant rapidement supprimé son commentaire. Je ne peux donc pas le remercier personnellement d’avoir tenté de vérifier les documents pour moi.
À partir de Qt 5.11, CONFIG += c++17
est pas encore un indicateur QMake reconnu . (Mis à jour: reconnu depuis Qt 5.12)
Ajouter QMAKE_CXXFLAGS += -std=c++17
fait le travail pour GCC & Clang; pour MSVC, vous aurez probablement besoin de spécifier/std:c++17
ou /std:c++latest
.
L'indicateur actuel est c++1z
, pas c++17
. En bref, pour bénéficier de la prise en charge de C++ 17, vous n'avez pas besoin de modifier QMAKE_CXXFLAGS
et vous pouvez simplement utiliser CONFIG += c++1z
.
On discute de la raison pour laquelle peut être trouvé dans ce rapport de bogue , mais cela revient plutôt à "nous l'avons implémenté en tant que c++1z
avant que C++ 17 ne soit normalisé, et nous ne nous embêtons pas à l'aliaser".
Note: Je me rends compte que vous avez juste besoin d'un nettoyage et d'une reconstruction. Je réponds à la question sous-jacente de "quels indicateurs dois-je utiliser pour activer la prise en charge de C++ 17?"
Pour Windows: Je télécharge qt-opensource-windows-x86-5.11.1, icncluded MinGW32 . Pour MinGW64, je télécharge qt-5.5.0-x64-mingw510r0- seh-rev0 et installez uniquement le compilateur . Configurez QtCreator, comme dit ici . Créez un nouveau projet et ajoutez QMAKE_CXXFLAGS + = -std = gnu ++ 1z au fichier .pro ( gcc doc ) . Pour le test, essayez de compiler ce code simple:
#include <optional>
std::optional<int> foo()
{
return std::nullopt;
}
int main(int argc, char *argv[])
{
foo();
}