Wie kann ich GCC-Warnungen aus Bibliotheksheadern unterdrücken?

126

Ich habe ein Projekt, das log4cxx-, Boost- usw. Bibliotheken verwendet, deren Header viele (sich wiederholende) Warnungen generieren. Gibt es eine Möglichkeit, Warnungen von Bibliotheks-Includes (dh #include <some-header.h>) oder Includes von bestimmten Pfaden zu unterdrücken? Ich möchte -Wall und / oder -Wextra wie gewohnt für Projektcode verwenden, ohne dass relevante Informationen verdeckt werden. Ich verwende derzeit grep für die Ausgabe, mache aber etwas Besseres.

AdSR
quelle

Antworten:

127

Sie können versuchen, Bibliotheksheader mit -isystemanstelle von einzuschließen -I. Dadurch werden sie zu "Systemheadern" und GCC meldet keine Warnungen für sie.

Phi
quelle
11
Wenn Sie dies in XCode versuchen, stecken Sie den Systempfad in Ihre "anderen C ++ - Flags" in den "benutzerdefinierten Compiler-Flags" in Ihren Ziel-Build-Einstellungen.
Matt Parkins
3
Ein möglicher Nachteil ist, dass g ++ auf einigen Plattformen automatisch alle Systemheader einschließt extern "C", was zu merkwürdigen Fehlern bei der C-Verknüpfung führt, wenn Sie #includeeinen C ++ - Header in einem -isystemPfad haben.
Tavian Barnes
1
+1 half mir, Probleme mit nervigen Boost-Warnungen zu lösen stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom
3
Warum hat dies so viel mehr Stimmen als die Antwort des OP, die 1,5 Stunden zuvor genau dasselbe sagte?
underscore_d
1
Für Xcode: Was ist, wenn in meinen Ziel-Build-Einstellungen unter "Andere C ++ - Flags" kein Ordnerpfad vorhanden ist? Könnte jemand diese Lösungen näher erläutern?
Ossir
107

Wenn Sie CMake verwenden, können Sie Ihre include_directoriesAnweisungen so ändern , dass sie das Symbol enthalten, SYSTEMdas Warnungen vor solchen Headern unterdrückt.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
Drew Noakes
quelle
Was ist, wenn die Bibliothek eine ${LIBFOO_USE_FILE}Variable bereitstellt , die mit dem Befehl include () von CMake verwendet werden soll ?
Waldyrious
2
Dies scheint fast die Lösung für mein Problem zu sein. Ich habe 1.) ein binäres Ziel, das von 2.) einem von mir selbst geschriebenen Header-Ziel abhängt, das von 3.) einigen externen Bibliotheken abhängt. Ich habe keine Ahnung, wie ich nur Warnungen für 1 & 2 erhalten soll. Hast du irgendwelche Ideen?
Knedlsepp
2
Scheint nicht zu funktionieren. Ich habe dies mit einem Projekt versucht, das verwendet, easylogging++und ich erhalte die gleiche große Menge an Warnungen aus dem easylogging++.h, obwohl der Ordner, in dem es sich befindet, in der SYSTEMOption enthalten ist.
Rbaleksandar
Vielen Dank dafür. Es hat mich vor Seiten und Seiten mit Warnungen bewahrt.
Svalorzen
1
Gleicher Kommentar wie für die akzeptierte Antwort: Dies ist eine schlechte Praxis für mich.
Raffi
55

Sie können Pragmas verwenden. Beispielsweise:

// 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
quelle
3
Nur verfügbar mit GCC> = 4.6
Caduchon
1
Ich liebe die Fähigkeit von Push / Pop-Pragmas. Ich erinnere mich an etwas wie für Java, das vor Jahren verfügbar war, und war frustriert / eifersüchtig auf C / C ++. Ich liebe es, dass dies ingcc
Trevor Boyd Smith
@TrevorBoydSmith MS clhat die Fähigkeit auch seit Jahren ... Manchmal gccist es etwas langsam, sich anzupassen.
Alexis Wilke
29

Ich habe den Trick gefunden. Für Bibliotheks-Includes anstelle der -IdirVerwendung -isystem dirim Makefile. GCC behandelt dann Boost usw. als System und ignoriert alle Warnungen von ihnen.

AdSR
quelle
Beachten Sie, dass Sie bei Verwendung eines vorkompilierten Headers das Flag hinzufügen müssen, wenn Sie sowohl den Header als auch den Code kompilieren.
user202729
9

#pragmasind Anweisungen an den Compiler. Sie können etwas vor dem #include setzen und es danach deaktivieren.

Sie können dies auch über die Befehlszeile tun .

Eine weitere GCC-Seite speziell zum Deaktivieren von Warnungen .

Ich würde mich für die Option entscheiden, # Pragmas im Quellcode zu verwenden und dann einen guten Grund (als Kommentar) anzugeben, warum Sie die Warnungen deaktivieren. Dies würde bedeuten, über die Header-Dateien nachzudenken.

GCC nähert sich dem, indem es die Warnungstypen klassifiziert . Sie können sie als Warnungen klassifizieren oder ignorieren. Die zuvor verlinkten Artikel zeigen Ihnen, welche Warnungen möglicherweise deaktiviert sind.

Hinweis: Sie können den Quellcode auch massieren, um bestimmte Warnungen mithilfe von Attributen zu verhindern . Dies bindet Sie jedoch ziemlich eng an GCC.

Hinweis 2: GCC verwendet auch die Pop / Push-Schnittstelle, wie sie im Microsoft-Compiler verwendet wird. Microsoft deaktiviert Warnungen über diese Schnittstelle. Ich schlage vor, Sie untersuchen dies weiter, da ich nicht weiß, ob es überhaupt möglich ist.

Hassan Syed
quelle
Ich habe über Pragmas nachgedacht, aber wenn ich eine Warnung vor dem Einfügen eines Headers unterdrücke, wie kann ich sie nach #include auf den vorherigen Status zurücksetzen? Ich möchte alle Warnungen für den Projektcode sehen (hat mir schon einige Male geholfen), habe aber die Kontrolle über die Befehlszeile.
AdSR
4

Sie können versuchen, vorkompilierte Header zu verwenden . Warnungen werden nicht verschwinden, aber zumindest werden sie nicht in Ihrer Hauptzusammenstellung angezeigt.

Pablo Santa Cruz
quelle
1
Dies könnte tatsächlich eine gute Idee sein. Einschlüsse von Drittanbietern ändern sich nicht jeden Tag.
AdSR
Genau. Obwohl ich sie unter Linux nicht so oft verwendet habe, funktionieren sie unter Visual Studio ziemlich gut.
Pablo Santa Cruz
Nein, sie werden weiterhin in der Kompilierung angezeigt, es sei denn, Sie verwenden eine andere Methode, um sie zu unterdrücken (z. B. -isystem, aber denken Sie daran, sie sowohl beim Kompilieren des Headers als auch im Code zu verwenden)
user202729,
2

Wenn Sie einen Systemheader explizit überschreiben müssen, sind Sie auf Pragmas beschränkt. Sie können über die make dependAusgabe überprüfen, welche Includes Sie verwenden .

Siehe auch Diagnose-Push-Pop für gcc> = 4.6

supaflav
quelle
1

Folgendes setzen

#pragma GCC system_header

Deaktiviert die GCC-Warnungen für den folgenden Code in dieser Datei.

Evgenii
quelle
-9

Es muss Gründe für diese Warnungen geben. Diese werden entweder durch Fehler in Ihrem Code verursacht, der die Bibliothek verwendet, oder durch Fehler im Bibliothekscode selbst. Korrigieren Sie im ersten Fall Ihren Code. Im zweiten Fall beenden Sie entweder die Verwendung der Bibliothek oder beheben Sie das Problem, wenn es sich um FOSS-Code handelt.


quelle
+1 für einen guten Rat: D, aber er fragt, wie man etwas Bestimmtes macht: D
Hassan Syed
4
Einige Warnungen sind unmöglich oder sehr schwer zu beheben, insbesondere in Code von Drittanbietern, insbesondere in Code, der reich an Metaprogrammierung ist, wie Boosts.
Ulidtko
3
Schlimmer noch, derjenige, der mich nervt, ist die "Deklaration von 'c' Schatten ein Mitglied von 'this' [-Werror = shadow]" tief, tief in einem Boost-Header. Das ist sicherlich kein Problem, aber es und ähnliche Probleme spucken die Ausgabe aus und machen es mir schwer, Instanzen zu finden, die einen echten Schatten in unserer Codebasis darstellen.
dmckee --- Ex-Moderator Kätzchen