2017-10-23 7 views
0

Ich kompiliere mein Projekt mit -Werror, um sicherzustellen, dass mein gesamter Code ohne erkennbare Warnungen ist. Mein aktuelles Projekt hat jedoch eine Abhängigkeit von Drittanbietern, die ein Problem enthält, das eine Warnung auslöst - und diese Warnung schlägt aufgrund des Flags -Werror fehl.Wie ignoriere ich "nutzlose Speicherklasse" mit gcc mit -Werror?

Ich möchte die -Werror Flag verwenden und ich möchte nicht das Drittanbieter-Paket korrigieren. Gibt es eine Möglichkeit, diese Warnung zu ignorieren?

Die Codezeile, die den Fehler generiert, ist eine Strukturdefinition mit einem "dangling" typedef.

typedef struct my_data_obj { 
    char* data; 
    uint32_t data_size; 
}; 

Dies ist offensichtlich ein Fehler - aber ich jede pragma oder eine solche Mechaniker die Warnung von dieser Header-Datei erzeugt ignorieren nicht finden können. Irgendwelche Ideen?

EDIT: SOLUTION

Obwohl ich Florian Weimer Antwort bin zu akzeptieren, weil es die Frage am ehesten Antworten es ist nicht die eigentliche fix ich mit erledigt. Ich beschreibe das unten. Durch das Einfügen der Header als System-Header habe ich genau das gemacht, was ich tun wollte - den Fehler unterdrücken, ohne das Paket reparieren zu müssen.

Was ich schließlich getan habe, war eine Patchdatei zu erstellen und diesen Patch jedes Mal anzuwenden, wenn das Projekt erstellt wird.

+0

Eigentlich würde ich einen * echten * Fehler betrachten, der behoben werden muss. Warum möchtest du es deaktivieren, anstatt das Problem tatsächlich * zu beheben *? –

+0

Jedes lokale Patching macht nachfolgende Importe von Upstream schwieriger. Ich kann verstehen, warum Leute das nicht machen wollen. –

+0

Weil es zu reparieren ist trivial - und ich würde gerne sehen, ob es eine Möglichkeit gibt, dies zu ignorieren, da es sicherlich ohne "-Werror" kompiliert. – MatUtter

Antwort

3

Ich nehme an, dass Sie package.h aus Dateien einfügen möchten, in denen Sie -Werror aktivieren möchten.

GCC hat kein separates Flag, um diese Warnung zu steuern, andernfalls hätte der Compiler es gedruckt. Mit der separaten Flagge könnten Sie #pragma GCC diagnostics ignore, wie in den anderen Antworten angegeben, möglicherweise mit einer Wrapper-Header-Datei verwendet haben.

Sie könnten jedoch die Headerdatei in ein separates Verzeichnis einfügen und statt -I zum Include-Pfad hinzufügen, verwenden Sie -isystem. Daher wird die Headerdatei als Systemheader behandelt. Wenn Sie nicht auch mit -Wsystem-headers kompilieren, werden Warnungen in Systemheadern unterdrückt.

+2

Und das ist sehr sinnvoll, wenn man Header von Drittanbietern als etwas behandelt, was man nicht ändern kann oder nicht ändern kann - das ist praktisch die Definition eines System-Headers. Darüber hinaus vermeidet dieser Ansatz die gleichzeitige Deaktivierung derselben Warnung für den projekteigenen Code. Wenn Sie Warnungen deaktivieren, sollte dies darauf zurückzuführen sein, dass diese Art von Warnung für Sie keine Rolle spielt, nicht weil sie in einer Datei auftreten, die Sie nicht interessieren. –

-1

Alle Warnungen und Fehler haben spezifische Namen und können auf einer Warnung/Fehlerbasis aktiviert oder deaktiviert werden.

Zum Beispiel kann sagen, ich habe eine nicht verwendete Variable und aktivierten Warnungen darüber, dann werde ich ähnlich wie

/some/path/main.cpp:18:9: warning: unused variable ‘i’ [-Wunused-variable] 

eine Meldung erhalten, dass letzter Teil der Nachricht, die man in den eckigen Klammern, die ist Name der spezifischen Warnung.

Mit diesem Namen können Sie Warnungen unter Verwendung der Option deaktivieren. Im Falle der obigen Warnung ist es deaktiviert mit -Wno-unused-variable.

Ihr Anwendungsfall ist ein wenig anders, dass Sie eine Warnung verwandelte sich in eine Fehler deaktivieren möchten. Dies ist dem obigen sehr ähnlich, aber die allgemeine Form der Option ist -Wno-error=<name of warning or error>. In unserem Beispiel ist es -Wno-error=unused-variable.

All dies ist natürlich in the GCC documentation, genauer in the warning options documentation.

Also was Sie tun müssen, ist herauszufinden, den Namen der Warnung, so dass Sie es für die -Wno-error= Option verwenden können.

+1

* Alle Warnungen und Fehler haben spezifische Namen *: Dies ist nicht wirklich wahr und ist das Problem hier. –

Verwandte Themen