Wie kann ich mit CMake die Warnstufe für ein Projekt (nicht die gesamte Lösung) festlegen ? Sollte unter Visual Studio und GCC funktionieren .
Ich habe verschiedene Optionen gefunden, aber die meisten scheinen entweder nicht zu funktionieren oder stimmen nicht mit der Dokumentation überein.
cmake
warning-level
Wernight
quelle
quelle
/Wall
Flag (mit dem NamenEnableAllWarnings
) unterstützen. Es werden noch mehr Warnungen ausgegeben als/W4
. Nach meiner Erfahrung werden jedoch viel zu viele Warnungen ausgegeben./Wall
ist verwendbar, wenn Sie eine "subtraktive" Strategie für Warnungen verfolgen möchten, genau wie bei Clangs-Weverything
. Anstatt die zu aktivierenden Warnungen auszuwählen, aktivieren Sie alles und wählen dann bestimmte zu deaktivierende Warnungen aus.Im modernen CMake funktioniert Folgendes gut:
Mein Kollege schlug eine alternative Version vor:
Durch
${TARGET_NAME}
den tatsächlichen Zielnamen ersetzen .-Werror
ist optional, verwandelt alle Warnungen in Fehler.Oder verwenden
add_compile_options(...)
Sie, wenn Sie es auf alle Ziele anwenden möchten, wie von @aldo in den Kommentaren vorgeschlagen.Stellen Sie außerdem sicher, dass Sie den Unterschied zwischen
PRIVATE
und verstehenPUBLIC
(öffentliche Optionen werden von Zielen geerbt, die vom angegebenen Ziel abhängen).quelle
add_compile_options(...)
wenn Sie es auf alle Ziele anwenden möchten.else()
oderendif()
.add_compile_options()
ist, dass die Warnungen an Ziele weitergegeben werden, die über hinzugefügt wurdenadd_subdirectory()
. Wenn Sie auf diese Weise externe Bibliotheken einschließen, erhalten Sie möglicherweise viele Warnungen, wenn diese Bibliothek mit einer anderen Warnstufe entworfen wurde.Einige CMake-Module, die ich geschrieben habe, enthalten experimentelle plattformübergreifende Warnunterdrückung :
Ergebnis für Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
Xcode-Attribut fest (auch bekannt als Build-Einstellungen -> Warnungen -> verdächtige implizite Konvertierungen -> JA )-Werror
Makefile gcc und clang:
-Wconversion
,-Werror
Visual Studio:
/WX
,/w14244
Links
quelle
Hier ist die beste Lösung, die ich bisher gefunden habe (einschließlich einer Compilerprüfung):
Dadurch wird die Warnstufe 2 in Visual Studio festgelegt. Ich nehme an mit einem
-W2
würde es auch in GCC funktionieren (ungetestet).Update von @Williams: Es sollte
-Wall
für GCC sein.quelle
-Wall
und vielleicht-Wextra
so detailliert unter gcc.gnu.org/onlinedocs/gcc/Warning-Options.html-W -Wall -Wextra -pedantic
.-Wextra
IIRC wurde-W
in einer späteren Version von GCC ersetzt, aber ich lasse beide aus Kompatibilitätsgründen.Wie pro Cmake 3.17.1 Dokumentation :
GCC und Clang teilen sich diese Flags, daher sollte dies alle 3 abdecken.
quelle
add_compile_options
ist verzeichnisweit, währendtarget_compile_options
es sich nur um ein einzelnes Ziel handelt.Wenn Sie
target_compile_options
- cmake verwenden, wird versucht, das Doppelflag zu/W*
verwenden, das vom Compiler gewarnt wird.quelle
add_compile_options
einzige verwendet, um Tonnen von Warnungen zu erhalten,/W3
mit denen überschrieben wird/W4
. Die Tatsache, dass CMake diese rudimentäre Option (Einstellen der Warnstufe) nicht anspricht, ist unglaublich.