CMake-cross-kompilieren: C-flags von toolchain-Datei ignoriert
Ich cmake für die cross-Compilierung. In meiner toolchain-Datei gibt es eine Zeile
SET(CMAKE_C_FLAGS "-std=gnu99")
Diese variable nicht gesetzt ist CMakeLists.txt wieder.
Wenn ich cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
wird dieses flag ignoriert.
Werden, genauer: Die Linie der flags.cmake
zeigt eine leere C_FLAGS =
Linie.
Aber in CMakeOutput.log
kann ich die Zeile finden Build flags: -std=gnu99
.
Fand ich heraus, dass eine zweite Auflage von cmake ..
(gleich mit oder ohne toolchain-Datei angegeben) behebt dieses problem.
Aber warum ist es nicht das erste mal, dass ich cmake ??
EDIT: Hinzugefügt MNWE
CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
project(myproject)
SET(files src/main.c)
add_executable(myexec ${files})
avr.cmake:
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_C_COMPILER avr-gcc)
SET(CMAKE_C_FLAGS "-std=gnu99")
- Danke!!! Ich hatte genau dieses Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gefunden, eine temporäre Lösung durch ersetzen der Zeile
durch
Ich wollte nur hinzufügen, einige hintergrund-Informationen (siehe z.B. hier wie, um das setup cmake_c/xx_flags pro toolchain?).
Kurz gesagt, die
CMAKE_<LANG>_FLAGS
Variablen zwischengespeichert werden, die von design in derCMake<Lang>Information.cmake
scripts (das heißt, Sie könnten die änderung in CMake-GUI-Anwendung nach dem configure-Schritt).So haben Sie - wenn Sie in der Toolchain - Datei, setzen Sie Sie in die cache-ersten. CMake ist ein eigenes script (ausgeführt nach der Toolchain-Datei) wird nicht mit einem
FORCE
, so wird es nicht überschreiben Sie es erneut.Werfen Sie einen Blick in CMakeCInformation.cmake (aus share\cmake-2.8\Module):
Wie Sie sehen können, ist der offizielle Weg, es zu tun wäre mit
CMAKE_C_FLAGS_INIT
zu injizieren zusätzliche flags. Das problem dort ist, dass spätere änderungen der Toolchain-Datei würde nicht erkannt werden (der cache nicht überschrieben werden, siehe oben).Genommen dies alles in Betracht, Ihre temporäre Lösung ist die richtige Wahl. Um wirklich sicher - weil die Toolchain-Datei geparst wird zweimal während der Konfiguration/Generierung - man könnte sogar hinzufügen, eine
UNSET
rufen Sie vor der EinstellungCMAKE_C_FLAGS
in Ihre toolchain-Datei:Andere oft Gefundene Lösung ist die Verwendung von so etwas wie:
injizieren compile-flags (aber das ist nicht build-Konfiguration bewusst ist, wie die Definitionen der Variablen sind). Siehe auch CMake clang und c++0x
Mit CMake 2.8.12 es wurden neue Befehle eingeführt, so dass Sie könnte (nicht getestet, nur die Möglichkeiten zeigen):
Sehen Was ist die moderne Methode zur Festlegung der Allgemeinen compile-flags in CMake? und CMake generator-Ausdruck, unterscheiden C /C++ - code weitere auf dieser.