Heim >Backend-Entwicklung >C++ >Wie setze ich Compiler-Flags in plattformübergreifenden CMake-Projekten mithilfe von Generatorausdrücken?

Wie setze ich Compiler-Flags in plattformübergreifenden CMake-Projekten mithilfe von Generatorausdrücken?

DDD
DDDOriginal
2024-11-03 01:08:02669Durchsuche

How to Set Compiler Flags in Cross-Platform CMake Projects Using Generator Expressions?

Moderne Methode zum Setzen von Compiler-Flags in plattformübergreifenden CMake-Projekten

Elegante Lösung mit CMake-Generator-Ausdrücken

Während Ihr Ansatz gültig ist, bietet das moderne CMake eine präzisere und robustere Lösung mithilfe der Generatorausdrücke von CMake:

cmake_minimum_required(VERSION 3.8)

project(HelloWorld)

string(
    APPEND _opts
    "$<IF:$<CXX_COMPILER_ID:MSVC>,"
        "/W4;$<$<CONFIG:RELEASE>:/O2>,"
        "-Wall;-Wextra;-Werror;"
            "$<$<CONFIG:RELEASE>:-O3>"
            "$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
    ">"
)

add_compile_options("${_opts}")

Im Vergleich zu Ihrem ursprünglichen Ansatz nutzt diese Methode Folgendes:

  • Generatorausdrücke zum bedingten Definieren von Compileroptionen basierend auf Compiler und Konfiguration.
  • Der Befehl string(APPEND ...) zum Sammeln der Optionen in einer Liste.
  • Die Funktion add_compile_options() für Legen Sie die Optionen für alle Ziele fest.

Abschaffung der manuellen Flag-Einstellung

Wie Sie bemerkt haben, wird generell davon abgeraten, CMAKE_CXX_FLAGS und ähnliche Variablen manuell festzulegen. Verwenden Sie stattdessen lieber die Funktion add_compile_options(), um Optionen anzuhängen, ohne die globalen Flags zu ändern.

Multi-Target-Projekteinrichtung

Um mehrere Ziele mit unterschiedlichen Optionen im zu erstellen Im selben Verzeichnis können Sie die Zieleigenschaften von CMake verwenden:

add_executable(HelloWorld_Debug_Clang HelloWorld.cpp)
target_compile_options(HelloWorld_Debug_Clang PRIVATE "-std=c++1z;-W4")
target_link_libraries(HelloWorld_Debug_Clang PRIVATE libc++)

add_executable(HelloWorld_Release_Gcc HelloWorld.cpp)
target_compile_options(HelloWorld_Release_Gcc PRIVATE "-std=c++1z;-W3")
target_link_libraries(HelloWorld_Release_Gcc PRIVATE libstdc++)

Dieser Ansatz ermöglicht es Ihnen, unterschiedliche Compileroptionen für jedes Ziel anzugeben und gleichzeitig eine einzige Projektdatei beizubehalten.

Modern Best Übungen

  • Verwenden Sie CMake-Generatorausdrücke für die Einstellung bedingter Flags.
  • Bevorzugen Sie add_compile_options() gegenüber der manuellen Einstellung von CMAKE_CXX_FLAGS.
  • Erstellen Sie mehrere Ziele mit unterschiedlichen Compileroptionen für plattformübergreifende Kompatibilität.
  • Verwenden Sie ein Build-Wrapper-Skript, um mehrere Konfigurationen aus einer einzigen CMake-Datei zu generieren.

Das obige ist der detaillierte Inhalt vonWie setze ich Compiler-Flags in plattformübergreifenden CMake-Projekten mithilfe von Generatorausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn