CMake bietet mehrere Mechanismen, um Flags an den Compiler zu senden:
Gibt es eine Methode, die im modernen Gebrauch der anderen vorgezogen wird? Wenn ja warum? Wie kann diese Methode auch mit mehreren Konfigurationssystemen wie MSVC verwendet werden?
Antworten:
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 EigenschaftenCOMPILE_OPTIONS
undINTERFACE_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 abertarget_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:quelle
target_compile_options
Add - Optionen, so können Sie letzte Zeile wie verändern diese zu machen es besser lesbar)COMPILE_OPTIONS
Verzeichniseigenschaft dies aus. Sie können denadd_compile_options
Befehl verwenden, um dies festzulegen. Die Optionen, für die dies ein guter Ansatz ist, sind normalerweise selten.PUBLIC
intarget_compile_options
?