Heim >Backend-Entwicklung >C++ >Wie modernisiere ich Compiler-Flag-Einstellungen in plattformübergreifenden CMake-Projekten?
Dieser Artikel enthält Anleitungen zum Festlegen von Compiler-Flags in plattformübergreifenden CMake Projekte. Es geht auf Bedenken hinsichtlich des bestehenden Ansatzes ein und untersucht verbesserte Methoden.
Der vorherige Ansatz verwendete set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ..."), was dies kann durch append(CMAKE_CXX_FLAGS "...") ersetzt werden. Darüber hinaus können die „Dirty Generator Expressions“ verwendet werden, um Bedingungen einzuführen und Optionen prägnant aufzulisten:
<code class="cmake">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}")</code>
Für Abwärtskompatibilität alternative Syntax mit add_compile_options () kann verwendet werden:
<code class="cmake">if(MSVC) add_compile_options("/W4" "$<$<CONFIG:RELEASE>:/O2>") else() add_compile_options("-Wall" "-Wextra" "-Werror" "$<$<CONFIG:RELEASE>:-O3>") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_compile_options("-stdlib=libc++") else() # nothing special for gcc at the moment endif() endif()</code>
Anstatt den C-Standard manuell anzugeben, verlässt sich modernes CMake auf die Angabe erforderlicher Funktionen:
<code class="cmake">target_compile_features(HelloWorld PUBLIC cxx_lambda_init_captures)</code>
Dadurch kann CMake die notwendigen Compiler-Flags zur Unterstützung der Funktion ermitteln.
Um separate Build-Verzeichnisse für jeden Compiler und jede Konfiguration zu vermeiden, kann ein Wrapper-Skript dies tun Kompilieren Sie mehrere Konfigurationen mit einer IDE wie Visual Studio oder einem CMake-Generator für mehrere Konfigurationen.
Das obige ist der detaillierte Inhalt vonWie modernisiere ich Compiler-Flag-Einstellungen in plattformübergreifenden CMake-Projekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!