2015-05-28 11 views
8

ich kompilieren meine QT5-basiertes Projekt mit auf g aktiviert Warnungen ++:Wie Qt-Header mit -Isystem (System-Header) mit qmake und QT5 enthalten?

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

Beim Kompilieren erzeugt Qt viele Warnungen (1000+ mit nur einem einfachen Widget), die Warnungen von meinem Code versteckt.

Wie kann qmake angewiesen werden, den -isystem-Schalter zu verwenden, wenn die Qt-Header anstelle von -I angegeben werden, um die Warnungen zu unterdrücken? Ich möchte die Warnungen nicht deaktivieren. Ich möchte sie für meinen Code behalten.

HINWEIS: Ich überprüfte this SO question, aber es funktioniert nicht in meinem Fall, es könnte nur für Qt4 sein, verwende ich Qt5.

HINWEIS 2: Dies ist ein acknowledged bug, ich bin auf der Suche nach einem Workaround. Ich benutze eine aktuelle Version von qmake aus Quellen 5.4.1, diese Version übergibt System-Header von /include und /usr/include als System-Header, aber nicht die Qt-Header.

HINWEIS 3: Ich weiß CMake würde funktionieren, aber das ist keine Option für mich.

+0

Der "Workaround" ist, einen Patch an qmake zu senden, das Unterstützung dafür hinzufügt.Oder um zu cmake zu wechseln, wo ich hoffe, dass das ein gelöstes Problem ist. –

+0

Ich habe eine aktuelle Version von qmake (Ich werde die Frage bearbeiten, um dies zu erwähnen). Ich habe versucht mit CMake: 'include_directories (SYSTEM dir1 dir2)' das funktioniert, aber ich muss bei qmake bleiben. Danke –

Antwort

11

fand ich zwei Möglichkeiten, Warnungen von Qt-Header zu unterdrücken, einen Weg von Qt in Systempfad zu installieren (wie in der anderen Antwort vorgeschlagen) und die anderen direkt von Ihrer pro Datei von GCC-Flags verwenden.

  1. Wenn Sie Ihre eigenen Qt Aufbau, konfigurieren Sie den Installationspfad des Headers zu einem Ihrer Systempfad:

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

    Systempfade sind /usr/include oder /usr/local/include oder einer der Rest aufgeführt in:

    $ 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 
    

    Quelle: this thread in der Entwicklungsliste von Qt.

  2. oder direkt in Ihrem Qt pro Datei, fügen Sie einfach die -isystem Flagge in die QMAKE_CXXFLAGS:

    # 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] 
    

    Der resultierende GCC-Befehlszeile wie folgt aussieht:

    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 
        ... 
    

    Beachten Sie, wie die Qt-Include-Pfade werden noch hinzugefügt mit -I, so dass Qt Creator alle Qt-Header "sehen" kann, aber GCC sieht das -isystem Flag und unterdrückt Warnungen für alle Unterordner.

+1

Keine Notwendigkeit dieses '$$ System' - verwenden Sie einfach $$ [QT_INSTALL_HEADERS]' :) – peppe

+0

Ich wusste nicht über die Klammern Syntax - Ich versuchte mit nur '$$ QT_INSTALL_HEADERS' und es hat nicht funktioniert , Mir fehlten die Klammern! Ich werde die Antwort aktualisieren. Vielen Dank! –

+1

Methode 2 funktioniert perfekt für mich - danke! –

1

Haben Sie Qt in einem System Pfad installiert? Ansonsten wird qmake -isystem nicht passieren.

Sie können prüfen, welche Pfade gemäß qmake Systempfade sind, indem Sie Ihre mkspec/qconfig.pri lesen (nachdem Sie configure ausgeführt haben), werden die Systempfade auf die QMAKE_DEFAULT_INCDIRS Variable festgelegt. Hier:

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