web-dev-qa-db-fra.com

Comment puis-je utiliser les fonctionnalités C ++ 14 lors de la construction de projets qmake?

J'utilise actuellement des fonctionnalités C++ 11 dans mes applications Qt. Cependant, j'aimerais utiliser certaines des nouvelles fonctionnalités C++ 14 dans mes applications.

Pour activer C++ 11 dans une application Qt, il suffit d'ajouter une seule ligne dans le fichier de projet qmake, à savoir:

CONFIG += c++11

ou ceci pour les versions antérieures:

QMAKE_CXXFLAGS += -std=c++1y

J'ai déjà essayé de faire la même chose avec C++ 14, mais cela n'a pas fonctionné. J'ai changé la ligne mentionnée ci-dessus du projet qmake comme ceci:

CONFIG += c++14

ou ceci pour les versions antérieures:

QMAKE_CXXFLAGS += -std=c++1y

Après cela, de nombreuses erreurs de compilation, qui n'existaient pas auparavant, apparaissent lors de la tentative de génération du projet. Le projet se compile bien, cependant, si j'essaie d'utiliser des fonctionnalités C++ 14, j'obtiens une erreur de compilation. Ceci est un exemple:

template<typename T>
constexpr T pi = T(3.1415926535897932385);

C'est l'erreur correspondante:

main.cpp:7: error: template declaration of 'constexpr const T pi'
constexpr T pi = T(3.1415926535897932385);  
          ^

Comment activer les fonctionnalités C++ 14 lors de l'utilisation d'un projet qmake dans QtCreator?

J'utilise Qt 5.3.2, Qt Creator 3.2.1 et MinGW 4.8.2 32 bits.

22
Rickforce

Qt Creator est juste un IDE .

Vous pouvez considérer les IDE comme des " plus intelligents éditeurs de texte" qui aident le développeur à déboguer, à construire, à compléter le code, à gérer les fichiers, etc.

Les IDE ne sont pas pertinents lors de la compilation.

Ce qui compte, c'est votre compilateur. Et c'est indépendant de votre IDE.

g ++ 4.8.x ne prend pas en charge de nombreuses fonctionnalités C++ 14: consultez cette page pour savoir quelles fonctionnalités C++ 14 sont prises en charge .

10
Vittorio Romeo

Ceci est désormais correctement pris en charge à partir de Qt 5.4 . Vous tapez simplement ceci dans votre fichier de projet qmake:

CONFIG += c++14

Le changement de code nécessaire a eu lieu au milieu de 2014 par Thiago:

Ajout du support pour CONFIG + = c ++ 14

Je viens de créer le changement de documentation nécessaire:

Mentionnez l'option c ++ 14 CONFIG dans la référence de variable qmake

Veuillez noter que les modèles de variables ne sont pris en charge qu'à partir de gcc 5.0, mais votre code fonctionne très bien. Cela peut être utilisé pour tester C++ 14 avec un ancien gcc:

main.cpp

#include <iostream>

int main()
{
    // Binary literals: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf
    // Single-quotation-mark as a digit separator: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
    std::cout << 0b0001'0000'0001;
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
CONFIG -= qt
CONFIG += c++14
SOURCES += main.cpp

Construire et exécuter

qmake && make && ./main

Production

257
31
lpapp

Pour une raison étrange, c'est ce que fait Qt: si le compilateur est gcc ou mingw, CONFIG+=C++14 est transformé en indicateur de compilation -std=c++14 (c'est ce que vous attendez)

S'il s'agit d'un autre compilateur (comme clang), CONFIG=C++14 est stupidement transformé en -std=c++11 (sic!), vous obtiendrez donc des erreurs sur les fonctionnalités non prises en charge, même si votre version de clang prend correctement en charge C++ 14.

Pour le corriger, spécifiez explicitement l'indicateur:

QMAKE_CXXFLAGS += -std=c++14

De cette façon, vous êtes sûr que votre compilateur (g ++, mingw ou clang) recevra les bons indicateurs.

5
pierre

Pour utiliser C++ 14 avec qmake avec les versions antérieures à Qt 5.4 (cela ne fait aucune différence que vous l'utilisiez avec Qt Creator ou avec un autre IDE ou depuis la ligne de commande) et gcc , ajoutez ceci à votre fichier . pro :

QMAKE_CXXFLAGS += -std=c++1y

qmake a obtenu le support de CONFIG += c++14 avec Qt 5.4, vous pouvez donc l'utiliser pour des projets où vous êtes à l'aise avec la nécessité d'au moins cette version de Qt. Veillez à utiliser les indicateurs explicites du compilateur ou à utiliser l'option CONFIG, mais pas les deux en même temps, pour éviter les commutateurs en conflit.


Malheureusement gcc 4.8.2 prend en charge très peu de fonctionnalités C++ 14 (voir ici ), mais vous pouvez le tester avec ceci extrait de code:

#include <iostream>

auto f() { return 42; }

int main()
{
    std::cout << f() << std::endl;
}

Cela compilera très bien avec QMAKE_CXXFLAGS += -std=c++1y, mais donnez un avertissement avec CONFIG += c++11 ou QMAKE_CXXFLAGS += -std=c++1x.

4
hyde