Jak wyłączyć ostrzeżenia GCC z nagłówków bibliotek?

126

Mam projekt, który używa bibliotek log4cxx, boost itp., Których nagłówki generują wiele (powtarzających się) ostrzeżeń. Czy istnieje sposób na pominięcie ostrzeżeń z dołączeń biblioteki (np. #Include <some-header.h>) lub z niektórych ścieżek? Chciałbym jak zwykle użyć -Wall i / lub -Wextra w kodzie projektu bez zasłaniania odpowiednich informacji. Obecnie używam grep do tworzenia wyjścia, ale chciałbym coś lepszego.

AdSR
źródło

Odpowiedzi:

127

Możesz spróbować dołączyć nagłówki bibliotek używając -isystemzamiast -I. To spowoduje, że staną się „nagłówkami systemowymi”, a GCC nie będzie zgłaszać dla nich ostrzeżeń.

Phi
źródło
11
Jeśli próbujesz to zrobić w XCode, przyklej ścieżkę systemu do swoich „innych flag C ++” w „niestandardowych flagach kompilatora” w ustawieniach kompilacji docelowej.
Matt Parkins,
3
Jedną potencjalną wadą jest to, że na niektórych platformach g ++ automatycznie zawija wszystkie nagłówki systemowe extern "C", co prowadzi do dziwnych błędów związanych z łączeniem C, jeśli #includew -isystemścieżce znajduje się nagłówek C ++ .
Tavian Barnes
1
+1 pomogło mi rozwiązać problemy z irytującymi ostrzeżeniami doładowania stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom
3
Dlaczego ma to o wiele więcej głosów niż odpowiedź samego PO, która mówi dokładnie to samo 1,5 godziny wcześniej?
underscore_d
1
W przypadku Xcode: co się stanie, jeśli w ustawieniach kompilacji docelowej nie ma ścieżki folderu w pozycji „Inne flagi języka C ++”? Czy ktoś mógłby rozwinąć te rozwiązania?
Ossir
107

W przypadku osób używających CMake można zmodyfikować include_directoriesdyrektywy, aby zawierały symbol, SYSTEMktóry pomija ostrzeżenia przed takimi nagłówkami.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
Drew Noakes
źródło
Co się stanie, jeśli biblioteka zawiera ${LIBFOO_USE_FILE}zmienną, która ma być używana z poleceniem include () CMake ?
waldyrious
2
Wydaje się, że to prawie rozwiązanie mojego problemu. Mam 1.) binarny cel, który zależy od 2.) nagłówka tylko docelowego napisanego przeze mnie, który zależy od 3.) niektórych zewnętrznych bibliotek. Nie mam pojęcia, jak uzyskać ostrzeżenia tylko dla 1 i 2. Masz jakieś pomysły?
knedlsepp
2
Nie wydaje się działać. Wypróbowałem to z projektem, który używa easylogging++i otrzymuję tę samą ogromną liczbę ostrzeżeń z, easylogging++.hmimo że folder, w którym się znajduje, został uwzględniony w SYSTEMopcji.
rbaleksandar
Dzięki za to DUŻO. Uratował mnie od stron i stron z ostrzeżeniami.
Svalorzen
1
Taki sam komentarz, jak w przypadku zaakceptowanej odpowiedzi: to zła praktyka dla mnie.
Raffi
55

Możesz użyć pragm. Na przykład:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop
andrewrjones
źródło
3
Dostępne tylko z GCC> = 4,6
Caduchon
1
Uwielbiam zdolność pragm push / pop. Pamiętam coś takiego jak java dostępne lata temu i frustracja / zazdrość o C / C ++. Uwielbiam, że to jest dostępne wgcc
Trevor Boyd Smith
@TrevorBoydSmith MS clma tę zdolność od lat ... Czasami gccadaptacja jest nieco powolna.
Alexis Wilke
29

Znalazłem sztuczkę. Biblioteka zawiera, zamiast -Idirużywać -isystem dirw pliku makefile. GCC traktuje wtedy wzmocnienie itp., Ponieważ system zawiera i ignoruje wszelkie ostrzeżenia z nich.

AdSR
źródło
Zwróć uwagę, że jeśli używasz prekompilowanego nagłówka, musisz dodać flagę podczas kompilowania zarówno nagłówka, jak i kodu.
user202729
9

#pragmasą instrukcjami dla kompilatora. możesz ustawić coś przed #include i wyłączyć to po.

Możesz to również zrobić w wierszu poleceń .

Kolejna strona GCC poświęcona wyłączaniu ostrzeżeń .

Wybrałbym opcję użycia # pragma w kodzie źródłowym, a następnie podanie rozsądnego powodu (jako komentarz), dlaczego wyłączasz ostrzeżenia. Oznaczałoby to rozumowanie dotyczące plików nagłówkowych.

GCC podchodzi do tego, klasyfikując typy ostrzeżeń. Możesz je sklasyfikować jako ostrzeżenia lub do zignorowania. Artykuły, do których prowadzą linki, pokazują, które ostrzeżenia mogą być wyłączone.

Uwaga: możesz również masować kod źródłowy, aby zapobiec niektórym ostrzeżeniom, używając atrybutów ; jednakże wiąże cię to dość mocno z GCC.

Uwaga 2: GCC używa również interfejsu pop / push, który jest używany w kompilatorze firmy Microsoft - Microsoft wyłącza ostrzeżenia za pośrednictwem tego interfejsu. Proponuję zbadać to dokładniej, ponieważ nie wiem, czy jest to w ogóle możliwe.

Hassan Syed
źródło
Rozważałem pragmaty, ale jeśli pominę ostrzeżenie przed dołączeniem nagłówka, jak przywrócić poprzedni stan po #include? Chcę zobaczyć wszystkie ostrzeżenia dotyczące kodu projektu (pomogło mi już kilka razy), ale mam kontrolę z wiersza poleceń.
AdSR
4

Możesz spróbować użyć prekompilowanych nagłówków . Ostrzeżenia nie znikną, ale przynajmniej nie pojawią się w twojej głównej kompilacji.

Pablo Santa Cruz
źródło
1
To może być dobry pomysł. Dołączenia innych firm nie zmieniają się codziennie.
AdSR
Dokładnie. Chociaż nie używałem ich tak często w Linuksie, działają one całkiem dobrze w Visual Studio.
Pablo Santa Cruz
Nie, nadal będą pojawiać się w kompilacji, chyba że użyjesz innego sposobu, aby je ukryć (na przykład -isystem, ale pamiętaj, aby użyć go zarówno podczas kompilowania nagłówka, jak i kodu)
user202729
2

Jeśli chcesz jawnie przesłonić nagłówek systemowy, jesteś ograniczony do pragm. Możesz sprawdzić, które obejmuje używasz, za pomocą make dependdanych wyjściowych.

Zobacz także diagnostyczne push-pop dla gcc> = 4.6

supaflav
źródło
1

Umieszczając następujące

#pragma GCC system_header

wyłączy ostrzeżenia GCC dla całego następującego kodu w tym pliku.

Evgenii
źródło
-9

Muszą być powody dla tych ostrzeżeń. Będą one spowodowane błędami w kodzie korzystającym z biblioteki lub błędami w samym kodzie biblioteki. W pierwszym przypadku napraw kod. W drugim przypadku albo przestań używać biblioteki, albo, jeśli jest to kod FOSS, napraw to.


źródło
+1 za dobrą radę: D ale pyta, jak zrobić coś konkretnego: D
Hassan Syed
4
Niektóre ostrzeżenia są niemożliwe lub bardzo trudne do naprawienia, szczególnie w kodzie firm trzecich, zwłaszcza w tak bogatym w metaprogramowanie kodzie, jak Boost.
ulidtko
3
Co gorsza, denerwuje mnie „deklaracja 'c' cienia członka 'this' [-Werror = shadow]” głęboko, głęboko w jakimś nagłówku boost. To z pewnością nie jest problem, ale to i podobne problemy wypluwają dane wyjściowe i utrudniają mi znalezienie instancji jako prawdziwego cienia w naszej bazie kodu.
dmckee --- ex-moderator kitten