Ich wollte nur zum Beispiel einige Hintergrundinformationen (diskutiert hinzufügen hier how to setup cmake_c/xx_flags per toolchain?).
Kurz gesagt, die CMAKE_<LANG>_FLAGS
Variablen werden im Design in den CMake<Lang>Information.cmake
Skripts zwischengespeichert (was bedeutet, dass Sie sie in der GUI-Anwendung von CMake nach dem Konfigurationsschritt ändern konnten).
Sie müssen also - wenn Sie sie in der Datei Toolchain setzen - sie zuerst in den Cache stellen. CMake's eigenes Skript (ausgeführt nach der Toolchain-Datei) kommt nicht mit FORCE
, es wird also nicht nochmal überschrieben.
Werfen Sie einen Blick in CMakeCInformation.cmake (von share \ cmake-2.8 \ Modules):
set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}")
# avoid just having a space as the initial value for the cache
if(CMAKE_C_FLAGS_INIT STREQUAL " ")
set(CMAKE_C_FLAGS_INIT)
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING
"Flags used by the compiler during all build types.")
Wie Sie die offizielle Art und Weise sehen können, zu tun, wäre es CMAKE_C_FLAGS_INIT
zusätzliche Flags injizieren werden. Das Problem besteht darin, dass spätere Änderungen in der Toolchain-Datei nicht erkannt werden (der Cache wird nicht überschrieben, siehe oben).
All dies berücksichtigt, ist Ihre temporäre Lösung die richtige Wahl.Um wirklich sicher zu sein - weil die Toolchain-Datei zweimal während der Konfiguration/Stellungsprozesses analysiert wird - man könnte sogar einen UNSET
Anruf hinzufügen, bevor CMAKE_C_FLAGS
in Ihrer Toolchain-Datei einstellen:
UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Eine weitere häufig gefundene Lösung zu verwenden ist so etwas wie :
injizieren Compiler-Flags (aber das ist nicht Build-Konfiguration bewusst, wie die Variablendefinitionen sind). Siehe auch CMake clang and c++0x
Mit CMake 2.8.12 dort neue Befehle eingeführt wurden, so könnten Sie tun (nicht getestet, nur die Möglichkeiten zeigen):
add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")
Siehe What is the modern method for setting general compile flags in CMake? und CMake generator expression, differentiate C/C++ code für mehr zu diesem Thema.
Danke! Ich hatte genau dieses Problem. – DouglasHeriot