2010-11-16 55 views
9

J'utilise qmake en tant que constructeur makefile et que vous voulez coller à elle. En outre, je voudrais utiliser "gcc -Wall -Werror -Wundef -Wextra" pour obtenir du code robuste. Je pense à "-pedantic" mais c'est plus loin. Mon principal problème pour le moment sont les tonnes d'avertissements générés par les bibliothèques comme boost, parties de qt et similaires.Y at-il une possibilité de passer comprend via -isystem lors de l'utilisation qmake

Au moment où je l'utilise chaque fois que je pragma En-têtes de génération d'avertissement

#pragma GCC diagnostic ignored "-Wall" 
    #include <QtGui> 
    ... 
    #include <QWidget> 
    #pragma GCC diagnostic error "-Wall" 

C'est loin d'être mignon, assez fastidieux et encombrant d'autant plus que d'autres programmeurs doivent le faire aussi. Existe-t-il une option utilisant qmake qui permet d'inclure qt-libraries comme en-têtes de système, supprimant ainsi leurs avertissements. Pour les makefiles simples et cmake je sais -isystem mais je ne peux pas trouver un pendentif qmake pour cela.

+0

On dirait que cela est un problème connu https: //bugreports.qt- project.org/browse/QTBUG-7220. Patches acceptés? – nonsensickle

Répondre

8

Le moyen le plus simple que j'ai trouvé est d'inclure directement via QMAKE_CXXFLAGS par exemple. pour Boost cela ressemble à ce qui suit dans le fichier de projet

QMAKE_CXXFLAGS += -isystem /usr/local/boost_1_44_0 
+0

On dirait que c'est un problème connu: https://bugreports.qt-project.org/browse/QTBUG-7220 – nonsensickle

+0

Tomáš Zato fournit une [implémentation conditionnelle intelligente QtCreator de ce] (http://stackoverflow.com/a/34928648/527489) qui vous donne ceci lors de la compilation sans casser l'intégration IDE. – sage

1

Étant donné que de nombreux paramètres sont codés en dur dans des fichiers de spécifications, je pense que vous devez créer le vôtre. Commencez par lire mkspecs/linux-g ++/qmake.conf ou mkspecs/win32-g ++/qmake.conf

Vous verrez que par défaut CONFIG utilise le paramètre warn_on. et mkspecs/communes/g ++ vous avez

QMAKE_CFLAGS_WARN_ON += -Wall -W 
QMAKE_CFLAGS_WARN_OFF += -w 
QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON 
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF 

de sorte que vous pouvez modifier le fichier de spécification et faire de nouveaux paramètres par défaut de pour chaque projet, ou vous pouvez définir ces variables dans votre fichier de projet.

CONFIG += warn_on 
QMAKE_CFLAGS_WARN_ON = -Wall -Werror -Wundef -Wextra -pedantic 
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON 

qt comprennent chemin est compilé dans mkspecs/caractéristiques/qt.prf comme

#handle includes 
INCLUDEPATH = $$QMAKE_INCDIR_QT $$INCLUDEPATH #prepending prevents us from picking up "stale" includes 

Vous ne voulez pas QMAKE_INCDIR_QT d'être une partie de INCLUDEPATH depuis sont jointes à -I ses composants. Vous souhaitez l'étendre en tant que $$ join (QMAKE_INCDIR_QT, "-isystem", "-isystem") ailleurs ...

3

Je viens d'ajouter à mon macx-clang/qmake.conf:

QMAKE_CXXFLAGS += $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem")

fonctionne bien maintenant.

-4

Notez que la bonne réponse à celle-ci est d'utiliser le mot-clé du système dans include_target() macro:

include_directories(SYSTEM ${QT_INCLUDES}) 

Cela fonctionne pour de nombreuses bibliothèques, non seulement Qt que je pouvais utiliser sans trop de problèmes. Mais le MagiC++. H est vraiment un travail horrible en comparaison et je devais avoir cette capacité.

Vous pouvez trouver plus d'informations sur cette question:

Use -isystem instead of -I with CMake

+0

Il pourrait être la bonne réponse si la question portait sur CMake, mais comme il s'agit de QMake, vous devrez peut-être vérifier que ... – boycy

+0

@boycy, Ha! Ha! Bon point! Cela ne serait définitivement pas utile avec qmake. Mon erreur. –

0

a trouvé une solution de contournement: Makefile changer manuellement.

Ajoutez cette ligne dans le fichier .pro

system(./suppress_system_warnings.sh) 

Et puis créez un fichier exécutable suppress_system_warnings.sh

#!/bin/bash 
run_in_background() { 
    pidof qmake > /dev/null 
    while [ $? -eq 0 ] 
    do 
     sleep 0.2 
     pidof qmake > /dev/null 
    done 

    file=Makefile 
    new_line=$(grep ^INCPATH $file | sed 's:-I\/:-isystem\/:g' | sed 's:-I\$:-isystem\$:') 
    line_num=$(grep -n ^INCPATH $file | cut -d':' -f1) 

    head -n $(expr $line_num - 1) $file > __tmp 
    echo $new_line >> __tmp 
    tail -n +$(expr $line_num + 1) $file >> __tmp 

    mv __tmp $file 
    exit 0; 
} 

run_in_background & 
exit 0;