Bei den oben genannten Versuchen werden Ihrer Datei / Ihrem Ziel weitere Flags hinzugefügt, anstatt wie erwartet zu überschreiben. Zum Beispiel aus den Dokumenten für Eigenschaften in Quelldateien - COMPILE_FLAGS :
Diese Flags werden der Liste der Kompilierungsflags hinzugefügt, wenn diese Quelldatei erstellt wird.
Sie sollten in der Lage sein, das -Weffc++
Flag für foo.cpp zu kontern, indem Sie dies tun
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Dies sollte dazu führen, dass im Compiler-Befehl -Wno-effc++
nachher hinzugefügt wird -Weffc++
, und die letztere Einstellung gewinnt. Sie können den vollständigen Befehl anzeigen und überprüfen, ob dies tatsächlich der Fall ist
make VERBOSE=1
Abgesehen davon äußert sich einer der Betreuer der GNU C ++ Standard Library -Weffc++
in dieser Antwort ziemlich negativ .
Ein weiterer Punkt ist, dass Sie add_definitions
in dem Sinne missbrauchen, dass Sie dies eher für Compiler-Flags als für die beabsichtigten Präprozessor-Definitionen verwenden.
Es wäre vorzuziehen, zu verwenden add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
oder für CMake-Versionen <3.0, um etwas mehr zu tun wie:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Als Antwort auf weitere Fragen in den Kommentaren unten glaube ich, dass es unmöglich ist , ein Flag in einer einzelnen Datei zuverlässig zu entfernen . Der Grund ist, dass für jede gegebene Quelldatei das COMPILE_OPTIONS
und 1 vorhanden istCOMPILE_FLAGS
des Ziels angewendet wird, diese jedoch in keiner der Eigenschaften für diese Quelldatei angezeigt werden.
Sie können versuchen, das Problemflag vom Ziel zu COMPILE_OPTIONS
entfernen und es dann einzeln auf jede Quelle des Ziels anzuwenden und es bei Bedarf aus der spezifischen Quelldatei zu entfernen.
Dies kann zwar in vielen Szenarien funktionieren, weist jedoch einige Probleme auf.
Die Eigenschaften der First- Source-Dateien enthalten nicht COMPILE_OPTIONS
nur COMPILE_FLAGS
. Dies ist ein Problem, da das COMPILE_OPTIONS
eines Ziels Generatorausdrücke enthalten kann , diese COMPILE_FLAGS
jedoch nicht unterstützt. Sie müssten also Generatorausdrücke berücksichtigen, während Sie nach Ihrem Flag suchen, und Sie müssten möglicherweise sogar Generatorausdrücke "analysieren", wenn Ihr Flag in einem oder mehreren enthalten wäre, um zu sehen, ob es erneut auf die verbleibenden angewendet werden sollte Quelldaten.
Zweitens: Seit CMake v3.0 können Ziele angeben INTERFACE_COMPILE_OPTIONS
. Dies bedeutet, dass eine Abhängigkeit Ihres Ziels die Ihres Ziels COMPILE_OPTIONS
über seine hinzufügen oder überschreiben kann INTERFACE_COMPILE_OPTIONS
. Sie müssten also alle Abhängigkeiten Ihres Ziels rekursiv durchlaufen (keine besonders einfache Aufgabe, da die Liste LINK_LIBRARIES
für das Ziel auch Generatorausdrücke enthalten kann), um diejenigen zu finden, die das Problemflag anwenden, und versuchen, es aus diesen zu entfernen Ziele ' INTERFACE_COMPILE_OPTIONS
auch.
In dieser Phase der Komplexität möchte ich einen Patch an CMake senden, um die Funktionalität zum bedingungslosen Entfernen eines bestimmten Flags aus einer Quelldatei bereitzustellen.
1: Beachten Sie, dass im Gegensatz zur COMPILE_FLAGS
Eigenschaft für Quelldateien die COMPILE_FLAGS
Eigenschaft für Ziele veraltet ist.