2015-05-28 17 views
8

posso compilare il mio progetto QT5-based con le avvertenze abilitati g ++:Come includere le intestazioni di Qt con -isystem (intestazioni di sistema) con qmake e qt5?

# project.pro file 
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Wconversion -Weffc++ 

Quando si compila, Qt produce un sacco di avvertimenti (1000+ con un solo semplice widget), si nascondono gli avvertimenti dal mio codice.

Come indicare a qmake di utilizzare lo switch -isystem quando si specificano le intestazioni di Qt anziché -I per sopprimere gli avvisi? Non voglio disattivare gli avvisi. Voglio tenerli per il mio codice.

NOTA: ho controllato this SO question ma nel mio caso non funziona, potrebbe essere solo per Qt4, io uso Qt5.

NOTA 2: questo è un acknowledged bug, sto cercando una soluzione alternativa. Uso una versione recente di qmake compilata dai sorgenti 5.4.1, questa versione passa le intestazioni di sistema da /include e /usr/include come intestazioni di sistema ma non le intestazioni di Qt.

NOTA 3: so che CMake avrebbe funzionato ma questa non è un'opzione per me.

+0

Il "workaround" è di inviare una patch a qmake che aggiunge il supporto per questo.O per passare a cmake, dove spero che questo sia un problema risolto. –

+0

Ho una versione recente di qmake (modifico la domanda per menzionarlo). Ho provato con CMake: 'include_directories (SYSTEM dir1 dir2)' questo funziona, ma ho bisogno di rimanere con qmake. Grazie –

risposta

11

ho trovato due modi per sopprimere avvertimenti da intestazioni di Qt, in un modo con l'installazione di Qt nel percorso di sistema (come suggerito nel altra risposta) e l'altra direttamente dal file pro utilizzando bandiere GCC.

  1. Quando si costruisce il proprio Qt, configurare il percorso di installazione del intestazione ad uno di percorso di sistema:

    $ ./configure -headerdir /usr/local/include 
    

    percorsi di sistema sono /usr/include o /usr/local/include o uno degli altri elencati:

    $ grep DEFAULT_INCDIRS mkspecs/qconfig.pri 
    QMAKE_DEFAULT_INCDIRS = /usr/include/c++/4.8 /usr/include/x86_64-linux-gnu/c++/4.8 /usr/include/c++/4.8/backward /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include 
    

    Fonte: this thread nella lista di sviluppo di Qt.

  2. o direttamente in file di Qt pro, è sufficiente aggiungere il flag -isystem nelle QMAKE_CXXFLAGS: percorsi

    g++ -c -pipe -isystem /usr/local/Qt-5.4.1/include -Wall ... 
        -I/usr/local/Qt-5.4.1/include 
        -I/usr/local/Qt-5.4.1/include/QtWidgets 
        ... 
    

    Si noti come il Qt comprendono:

    # the line below suppresses warnings generated by Qt's header files: we tell 
    # GCC to treat Qt's headers as "system headers" with the -isystem flag 
    QMAKE_CXXFLAGS += -isystem $$[QT_INSTALL_HEADERS] 
    

    La riga di comando GCC risultante assomiglia sono ancora aggiunti con -I, consentendo a Qt Creator di "vedere" tutte le intestazioni Qt, ma GCC visualizza il flag -isystem e sopprime gli avvisi per tutte le sottocartelle.

+1

Non c'è bisogno di quel '$$ system' - basta usare' $$ [QT_INSTALL_HEADERS] ':) – peppe

+0

Non sapevo la sintassi delle parentesi - Ho provato con' $$ QT_INSTALL_HEADERS' e non ha funzionato , Mi mancavano le parentesi! Aggiornerò la risposta Grazie! –

+1

Il metodo 2 funziona perfettamente per me - grazie! –

1

Hai installato Qt in un percorso ? Altrimenti qmake non passerà allo -isystem.

È possibile verificare quali percorsi sono percorsi di sistema in base alle qmake leggendo il vostro mkspec/qconfig.pri (dopo aver eseguito configure), i percorsi di sistema sono impostati alla variabile QMAKE_DEFAULT_INCDIRS. Qui:

QMAKE_DEFAULT_INCDIRS = /usr/include/c++/4.8 /usr/include/x86_64-linux-gnu/c++/4.8 /usr/include/c++/4.8/backward /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include 
Problemi correlati