Wie füge ich einen Linker oder ein Compile-Flag in einer CMake-Datei hinzu?
Lesezeit: 6 Minuten
Solti
Ich benutze die arm-linux-androideabi-g++ Compiler. Wenn ich versuche, ein einfaches “Hello, World!” Programm kompiliert es gut. Wenn ich es teste, indem ich diesem Code eine einfache Ausnahmebehandlung hinzufüge, funktioniert es auch (nach dem Hinzufügen von -fexceptions .. Ich denke, es ist standardmäßig deaktiviert).
Dies ist für ein Android-Gerät, und ich möchte nur CMake verwenden, nicht ndk-build.
Zum Beispiel – first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
Das Problem … Ich versuche, die Datei mit einer CMake-Datei zu kompilieren.
Ich möchte die hinzufügen -fexceptions als Fahne. Ich habe es mit versucht
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
und
set ( CMAKE_C_FLAGS "fexceptions")
Es zeigt immer noch einen Fehler an.
Im Moment habe ich das gleiche Problem und versuche verschiedene Dinge. Hängen Sie ein wenig und ich poste eine Antwort. Für Compile-Flags gibt es einen unsauberen, aber einfachen Weg: add_definitions(“-truc”)
– Firmmo
3. August 2012 um 13:43 Uhr
Für eine aktuellere Diskussion zu dieser Frage (insbesondere wenn Sie CMake 3.x oder neuer verwenden): Was ist die moderne Methode zum Setzen allgemeiner Kompilier-Flags in CMake?.
Hinweis: Angesichts der Entwicklung von CMake seit dem Schreiben dieser Antwort sind die meisten Vorschläge hier jetzt veraltet/veraltet und haben bessere Alternativen
Angenommen, Sie möchten diese Flags hinzufügen (deklarieren Sie sie besser in einer Konstante):
get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)
if(TEMP STREQUAL "TEMP-NOTFOUND")
SET(TEMP "") # Set to empty string
else()
SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
endif()
# Append our values
SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )
set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )
Im Moment verwende ich Methode 2.
Warum ist add_definitions() unsauber?
– leinaD_natipaC
9. Oktober 2014 um 16:15 Uhr
@leinaD_natipaC: Die amtliche Dokumentation sagt: Dieser Befehl kann verwendet werden, um beliebige Flags hinzuzufügen, aber es ist beabsichtigt, Präprozessordefinitionen hinzuzufügen. Ich denke, deshalb.
– Benoît Blanchon
21. November 2014 um 17:01 Uhr
Während dies die akzeptierte Antwort ist, die wirklich CMAKE im sehr alten Stil zeigt, lesen Sie die Antwort von @vitaut, um zu erfahren, wie jeder neue CMAKE-Code in Bezug auf Kompilierzeitparameter strukturiert sein sollte
– Harald Scheirich
29. April 2020 um 13:35 Uhr
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value") ist kürzer und sauberer als set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
– blutig
30. April 2020 um 13:21 Uhr
veraltete Beratung
– apmcartney
17. März 2021 um 15:09 Uhr
vitaut
In neueren Versionen von CMake können Sie Compiler- und Linker-Flags für ein einzelnes Ziel mit setzen target_compile_options und target_link_libraries (ja, letzteres setzt auch Linker-Optionen):
Der Vorteil dieser Methode besteht darin, dass Sie die Weitergabe von Optionen an andere Ziele, die von diesem Via abhängen, steuern können PUBLIC und PRIVATE.
Ab CMake 3.13 können Sie auch verwenden target_link_options um Linker-Optionen hinzuzufügen, die die Absicht klarer machen.
Ich habe versucht, es zu verwenden: target_compile_options(main_static PRIVATE --static) aber es scheint nicht zu funktionieren, hast du eine Ahnung warum?
– Pawel Szczur
5. November 2016 um 0:12 Uhr
-static ist wahrscheinlich ein Linker, keine Compiler-Option. Versuchen Sie, es weiterzugeben target_link_libraries.
– vitaut
5. November 2016 um 14:25 Uhr
Oh, target_link_libraries Ich habe diesen Teil des Dokuments verpasst: “Bibliotheken angeben oder Fahnen zu verwenden, wenn ein bestimmtes Ziel verlinkt wird.”. Danke.
– Pawel Szczur
5. November 2016 um 14:32 Uhr
Eine neue Ergänzung: CMake 3.13 führt ein target_link_options als sauberere Möglichkeit, Linker-Flags anzugeben. Sie sollten die Verwendung vermeiden target_link_libraries für Linker-Flags in der Zukunft und Verwendung target_link_options stattdessen.
Versuchen Sie, die Variable zu setzen CMAKE_CXX_FLAGS anstatt CMAKE_C_FLAGS:
set (CMAKE_CXX_FLAGS "-fexceptions")
Die Variable CMAKE_C_FLAGS wirkt sich nur auf den C-Compiler aus, aber Sie kompilieren C++-Code.
Hinzufügen der Flagge zu CMAKE_EXE_LINKER_FLAGS ist überflüssig.
Ich habe das versucht, aber es gibt immer noch Fehler. Set(CMAKE_CXX_FLAGS “-fexceptions”) ist die einzige Möglichkeit, das Compiler-Flag anzugeben.
– Solti
2. August 2012 um 19:50 Uhr
Ich habe das Problem gelöst, aber nicht auf eine gute Art und Weise, es ist ein schlechter Workaround. Ich habe -DCMAKE_CXX_FLAGS= “-fExceptions” in der Befehlszeile gemacht. Aus irgendeinem Grund liest cmake keine Flags aus der .cmake-Datei. 🙁 .. danke sakra für deine antwort ..
– Solti
2. August 2012 um 21:59 Uhr
-DCMAKE_CXX_FLAGS= “-fexceptions” Es sollte KEIN Leerzeichen zwischen = und ” stehen
– Evandrix
5. Dezember 2012 um 8:05 Uhr
In Bezug auf das, was Sie gesagt haben: “Aus irgendeinem Grund liest cmake keine Flags aus der .cmake-Datei.” Stellen Sie sicher, dass Sie den vorhandenen Cache löschen. Dies kann erreicht werden, indem alles aus dem Build-Verzeichnis gelöscht wird, bevor cmake erneut ausgeführt wird.
– zaizen
15. Juli 2016 um 5:32 Uhr
John McFarlane
Die bevorzugte Methode zum Angeben von Toolchain-spezifischen Optionen ist die Verwendung von CMake Toolchain-Einrichtung. Dadurch wird eine saubere Trennung gewährleistet zwischen:
Anweisungen zum Organisieren von Quelldateien in Zielen – ausgedrückt in CMakeLists.txt Dateien, vollständig Toolchain-agnostisch; und
Details darüber, wie bestimmte Toolchains konfiguriert werden sollten – getrennt in CMake-Skriptdateien, erweiterbar durch zukünftige Benutzer Ihres Projekts, skalierbar.
Idealerweise sollte es keine Compiler/Linker-Flags in Ihrer geben CMakeLists.txt Dateien – sogar innerhalb if/endif Blöcke. Und Ihr Programm sollte für die native Plattform mit der Standard-Toolchain (z. B. GCC unter GNU/Linux oder MSVC unter Windows) ohne zusätzliche Flags erstellt werden.
Schritte zum Hinzufügen einer Toolchain:
Erstellen Sie eine Datei, z arm-linux-androideadi-gcc.cmake mit globalen Toolchain-Einstellungen:
# toolchain file for use with gcov
set(CMAKE_CXX_FLAGS_INIT "--coverage -fno-exceptions -g")
Erweiterte Sicherheitskontrollen.
# toolchain file for use with gdb
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=address,undefined -fsanitize-undefined-trap-on-error")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fsanitize=address,undefined -static-libasan")
Sie können einem bestimmten Ziel auch Linker-Flags hinzufügen, indem Sie die verwenden LINK_FLAGS Eigentum:
Im Moment habe ich das gleiche Problem und versuche verschiedene Dinge. Hängen Sie ein wenig und ich poste eine Antwort. Für Compile-Flags gibt es einen unsauberen, aber einfachen Weg: add_definitions(“-truc”)
– Firmmo
3. August 2012 um 13:43 Uhr
Für eine aktuellere Diskussion zu dieser Frage (insbesondere wenn Sie CMake 3.x oder neuer verwenden): Was ist die moderne Methode zum Setzen allgemeiner Kompilier-Flags in CMake?.
– ComicSansMS
9. Juli 2015 um 7:35 Uhr
Wenn der Link markiert ist, zielen Sie auf die Konfiguration ab rPfad Sehen Sie sich dann die spezifischen CMake-rpath-Befehle an gitlab.kitware.com/cmake/community/wikis/doc/cmake/…
– Gabriel Devillers
19. April 2019 um 14:59 Uhr