it-swarm.com.de

Unterschied zwischen add_compile_options und SET (CMAKE_CXX_FLAGS ...)

Diese Frage bezieht sich auf Weisen Sie Cmake an, CXX und CXXFLAGS beim Fahren von Links zu verwenden? In der vorherigen Frage versuchen wir CMake anzuweisen, CXXFLAGS zu verwenden, wenn es den Linker aufruft.

add_compile_options

Wir haben den folgenden Code gefunden

if (CMAKE_VERSION VERSION_LESS 2.8.12)
    add_definitions(-foo)
else()
    add_compile_options(-foo)
endif()

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

erzeugt die Ausgabe

CXXFLAGS:

SET CMAKE_CXX_FLAGS

Wir haben den folgenden Code gefunden

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

erzeugt die Ausgabe

CXXFLAGS: -foo

Fragen

Wir haben festgestellt, dass CMake in beiden Fällen Objektdateien mit -foo Erstellt. Also macht sich -foo Definitiv auf den Weg nach CXXFLAGS.

Was ist der Unterschied zwischen dem ersten Satz von CMake-Code und dem zweiten Satz von CMake-Code?

Warum ist CMAKE_CXX_FLAGS In einer Instanz nicht gesetzt und in der anderen Instanz gesetzt?

22
jww
  • CMAKE_CXX_FLAGS Wird verwendet, um Flags für alle C++ - Ziele hinzuzufügen. Das ist praktisch, um allgemeine Argumente wie Warnstufen oder ausgewählte erforderliche C++ - Standards zu übergeben. Es hat keine Auswirkung auf C- oder Fortran-Ziele und der Benutzer kann zusätzliche Flags übergeben.

  • add_compile_options Fügt die Optionen allen Zielen im Verzeichnis und seinen Unterverzeichnissen hinzu. Dies ist praktisch, wenn Sie eine Bibliothek in einem Verzeichnis haben und Optionen zu allen Zielen hinzufügen möchten, die sich auf die Bibliothek beziehen, jedoch nicht auf alle anderen Ziele. Zusätzlich kann add_compile_options Argumente mit Generatorausdrücken behandeln. Die Dokumentation besagt ausdrücklich, dass

Mit diesem Befehl können beliebige Optionen hinzugefügt werden. Es gibt jedoch alternative Befehle zum Hinzufügen von Präprozessordefinitionen (target_compile_definitions() und add_definitions()) oder zum Einschließen von Verzeichnissen (target_include_directories() und include_directories()).

  • add_definitions Soll Pre-Prozessor-Werte vom Typ -DFOO -DBAR=32 (/D Unter Windows) übergeben, die Pre-Prozessor-Variablen definieren und festlegen. Sie könnten jedes Flag übergeben, aber die Flags des obigen Formulars werden erkannt und der Eigenschaft [COMPILE_DEFINITIONS][2] Hinzugefügt, die Sie später lesen und ändern können. Hier können Sie auch Generatorausdrücke verwenden. In Dokumentation werden Bereiche für Verzeichnisse, Ziele und Quelldateien erwähnt.

Für ein bestimmtes Ziel sammelt CMake alle Flags von CMAKE_CXX_FLAGS, Dem Ziel und dem Verzeichnis COMPILE_DEFINITIONS Und von allen add_compile_options, Die das Ziel betreffen.
CMAKE_CXX_FLAGS Werden von den anderen Befehlen nicht verändert oder umgekehrt. Dies würde den Umfang dieser Befehle verletzen.

26
usr1234567