Frage Wie Linker oder Compiler-Flag in cmake-Datei hinzufügen?


Ich benutze die arm-linux-androideabi-g++ Compiler. Wenn ich versuche, ein einfaches "Hallo Welt" -Programm zu kompilieren, kompiliert es sich gut. Wenn ich es durch Hinzufügen einer einfachen Ausnahmebehandlung in diesem Code teste, funktioniert es auch (nach dem Hinzufügen) -fexceptions .. ich denke, es ist standardmäßig deaktiviert)

Dies ist für ein Android-Gerät und ich möchte nur verwenden cmake nicht ndk-build 

Beispielsweise - 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 das hinzufügen -fexceptions als eine Fahne. Ich habe es 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.


148
2017-08-02 18:52


Ursprung


Antworten:


Angenommen, Sie möchten diese Flags hinzufügen (besser, sie in einer Konstanten zu deklarieren):

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

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

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

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
    
  2. Angehängt 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. Zieleigenschaften verwenden, 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.


180
2017-08-03 14:02



In neueren Versionen von CMake können Sie auch Compiler- und Linker-Flags für ein einzelnes Ziel festlegen target_compile_options und target_link_libraries jeweils (ja, letztere legt auch Linker-Optionen fest):

target_compile_options(first-test PRIVATE -fexceptions)

Der Vorteil dieser Methode besteht darin, dass Sie die Weitergabe von Optionen an andere Ziele steuern können, die von diesem abhängen PUBLIC und PRIVATE.


89
2018-02-27 20:07



Versuchen Sie, die Variable festzulegen CMAKE_CXX_FLAGS Anstatt von CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

Die Variable CMAKE_C_FLAGS betrifft nur den C-Compiler, aber Sie kompilieren C ++ - Code.

Hinzufügen der Flagge zu CMAKE_EXE_LINKER_FLAGS ist überflüssig.


28
2017-08-02 19:27



Besuche die ucm_add_flags und ucm_add_linker_flags Makros von ucm (meine Menge nützlicher Cmake-Makros) - sie befassen sich mit dem Anhängen von Compiler / Linker-Flags


0
2017-10-05 20:45



Sie können Linker-Flags auch zu einem bestimmten Ziel hinzufügen, indem Sie 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 erstellen, zu dem eine Verknüpfung hergestellt werden soll.


0
2018-04-11 14:29