Wie füge ich einen Linker oder ein Compile-Flag in einer CMake-Datei hinzu?

Lesezeit: 6 Minuten

Wie fuge ich einen Linker oder ein Compile Flag in einer
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;
}

./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions

Es funktioniert ohne Probleme…

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?.

    – 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

1647059412 838 Wie fuge ich einen Linker oder ein Compile Flag in einer
Offi

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):

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

Es gibt mehrere Möglichkeiten, sie hinzuzufügen:

  1. Die einfachste (nicht sauber, aber einfach und bequem und funktioniert nur für Compile-Flags, C & C++ gleichzeitig):

     add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
    
  2. Anhängen an entsprechende CMake-Variablen:

     SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
     SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
    
  3. Verwendung von Zieleigenschaften, vgl. Dok CMake-Compile-Flag-Zieleigenschaft und müssen den Zielnamen kennen.

     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

Wie fuge ich einen Linker oder ein Compile Flag in einer
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):

target_compile_options(first-test PRIVATE -fexceptions)

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.

    – ComicSansMS

    23. Oktober 2018 um 6:59 Uhr

  • Es gibt auch add_compile_options – siehe stackoverflow.com/questions/39501481/… und in jüngerer Zeit add_link_options

    – Bruce Adams

    7. Dezember 2018 um 14:50 Uhr


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

1647059413 416 Wie fuge ich einen Linker oder ein Compile Flag in einer
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:

  1. Erstellen Sie eine Datei, z arm-linux-androideadi-gcc.cmake mit globalen Toolchain-Einstellungen:

    set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
    set(CMAKE_CXX_FLAGS_INIT "-fexceptions")
    

    (Hier finden Sie eine beispielhafte Linux-Cross-Compiling-Toolchain-Datei Hier.)

  2. Wenn Sie mit dieser Toolchain ein Build-System generieren möchten, geben Sie die CMAKE_TOOLCHAIN_FILE Parameter auf der Kommandozeile:

    mkdir android-arm-build && cd android-arm-build
    cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/../arm-linux-androideadi-gcc.cmake ..
    

    (Hinweis: Sie können keinen relativen Pfad verwenden.)

  3. Normal bauen:

    cmake --build .
    

Toolchain-Dateien erleichtern die Cross-Kompilierung, haben aber auch andere Verwendungszwecke:

  • Gehärtete Diagnose für Ihre Komponententests.

    set(CMAKE_CXX_FLAGS_INIT "-Werror -Wall -Wextra -Wpedantic")
    
  • Schwierig zu konfigurierende Entwicklungstools.

    # 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:

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

Wenn Sie diese Änderung an andere Ziele weitergeben möchten, können Sie ein Dummy-Ziel zum Verknüpfen erstellen.

1647059414 698 Wie fuge ich einen Linker oder ein Compile Flag in einer
myuce

Dies hat bei mir funktioniert, als ich eine Vorkompilierungsdefinition mit dem Namen “NO_DEBUG” benötigte:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -DNO_DEBUG")

Dann von Code

#ifdef NO_DEBUG
.....

992680cookie-checkWie füge ich einen Linker oder ein Compile-Flag in einer CMake-Datei hinzu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy