Für modernes CMake (Versionen 2.8.12 und höher) sollten Sie verwenden target_compile_options
, das intern Zieleigenschaften verwendet.
CMAKE_<LANG>_FLAGS
ist eine globale Variable und die fehleranfälligste. Es werden auch keine Generatorausdrücke unterstützt , was sehr nützlich sein kann.
add_compile_options
basiert auf Verzeichniseigenschaften, was in einigen Situationen in Ordnung ist, aber normalerweise nicht die natürlichste Art, Optionen anzugeben.
target_compile_options
arbeitet auf Zielbasis (durch Festlegen der Eigenschaften COMPILE_OPTIONS
und INTERFACE_COMPILE_OPTIONS
target), was normalerweise zu dem saubersten CMake-Code führt, da die Kompilierungsoptionen für eine Quelldatei davon abhängen, zu welchem Projekt die Datei gehört (und nicht von welchem Verzeichnis sie abgelegt wird) auf der Festplatte). Dies hat den zusätzlichen Vorteil, dass auf Anfrage automatisch Optionen an abhängige Ziele weitergegeben werden.
Obwohl sie etwas ausführlicher sind, ermöglichen die Befehle pro Ziel eine einigermaßen fein abgestimmte Kontrolle über die verschiedenen Erstellungsoptionen und verursachen (meiner persönlichen Erfahrung nach) auf lange Sicht am wenigsten Kopfschmerzen.
Theoretisch können Sie die jeweiligen Eigenschaften auch direkt mit einstellen set_target_properties
, sind aber target_compile_options
normalerweise besser lesbar.
Um beispielsweise die Kompilierungsoptionen eines Ziels foo
basierend auf der Konfiguration mithilfe von Generatorausdrücken festzulegen, können Sie Folgendes schreiben:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")