2015-05-28 10 views
8

skompilować mój projekt Qt5 opartego ostrzeżeń włączone g ++:Jak dołączyć nagłówki Qt do -isystem (nagłówki systemowe) za pomocą qmake i qt5?

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

Podczas kompilacji Qt produkuje mnóstwo ostrzeżeń (1000+ za pomocą jednego prostego widget), ukrywając ostrzeżenia z mojego kodu.

Jak powiedzieć programowi qmake o użyciu przełącznika -isystem podczas określania nagłówków Qt zamiast -I, aby wyłączyć ostrzeżenia? Nie chcę wyłączyć ostrzeżeń Chcę zachować je dla mojego kodu.

UWAGA: Sprawdziłem this SO question, ale nie działa w moim przypadku, może to być tylko dla Qt4, używam Qt5.

UWAGA 2: jest to acknowledged bug, szukam obejścia. Używam ostatniej wersji qmake skompilowanej ze źródeł 5.4.1, ta wersja przekazuje nagłówki systemowe od /include i /usr/include jako nagłówki systemowe, ale nie nagłówki Qt.

UWAGA 3: Wiem, że CMake zadziała, ale nie jest to opcja dla mnie.

+0

"Obejście problemu" polega na przesłaniu łaty do qmake, która dodaje obsługę tego.Lub, aby przejść do cmake, gdzie mam nadzieję, że jest to rozwiązany problem. –

+0

Mam najnowszą wersję qmake (będę edytować pytanie, aby o tym wspomnieć). Próbowałem z CMake: 'include_directories (SYSTEM dir1 dir2)' działa, ale muszę trzymać się qmake. Dzięki –

Odpowiedz

11

Znalazłem dwa sposoby tłumią ostrzeżenia z nagłówkami Qt, jednym ze sposobów, instalując Qt w ścieżce systemowej (jak zasugerowano w drugiej odpowiedzi), a drugi bezpośrednio z pliku pro za pomocą flagi gcc.

  1. Przy budowie własnego Qt skonfigurować ścieżkę instalacji nagłówka do jednej ścieżki systemowej:

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

    ścieżki systemowe są /usr/include lub /usr/local/include lub jeden z pozostałych wymienionych w:

    $ 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 
    

    Źródło: this thread w liście rozwijanej Qt.

  2. lub bezpośrednio w pliku Qt pro, wystarczy dodać flagę -isystem w QMAKE_CXXFLAGS z:

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

    Powstała linia poleceń GCC wygląda następująco:

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

    nocie jak Qt obejmują ścieżek są nadal dodawane z -I, dzięki czemu Qt Creator "widzi" wszystkie nagłówki Qt, ale GCC widzi flagę -isystem i blokuje ostrzeżenia dla wszystkich podfolderów.

+1

Nie trzeba tego "systemu $$" - wystarczy użyć '$$ [QT_INSTALL_HEADERS]' :) – peppe

+0

Nie wiedziałem o składni nawiasów - próbowałem za pomocą '$$ QT_INSTALL_HEADERS' i to nie działało , Brakowało mi nawiasów! Zaktualizuję odpowiedź. Dzięki! –

+1

Metoda 2 działa idealnie dla mnie - dzięki! –

1

Czy zainstalowałeś Qt w ścieżce system? W przeciwnym razie qmake nie przejdzie -isystem.

Można sprawdzić, które ścieżki są ścieżkami Układ według qmake przez czytanie mkspec/qconfig.pri (po uruchomieniu configure), ścieżki systemowe są ustawione do zmiennej QMAKE_DEFAULT_INCDIRS. Tutaj:

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 
Powiązane problemy