2012-08-02 13 views
137

Sto usando il compilatore arm-linux-androideabi-g++. Quando provo a compilare un semplice programma "ciao mondo", compila bene. Quando ho prova con l'aggiunta di una semplice manipolazione in quel codice funziona troppo eccezione (dopo l'aggiunta di -fexceptions .. Credo che è disabilitato per default)Come aggiungere il linker o il flag di compilazione nel file cmake?

Questo è per un dispositivo Android e ho solo voglia di utilizzare cmake non ndk-build

Per esempio - first.cpp

#include <iostream> 

using namespace std; 

int main() 
{ 
    try{ 
    } 
    catch(...) 
    { 
    } 
    return 0; 
} 

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

funziona senza alcun problema ..

Il problema .. Sto cercando di compilare il file con un file cmake.

Desidero aggiungere lo -fexceptions come bandiera. Ho provato con

set (CMAKE_EXE_LINKER_FLAGS -fexceptions) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions") 

e

set (CMAKE_C_FLAGS "fexceptions") 

Esso mostra ancora un errore.

+0

adesso sto avendo lo stesso problema, e sto provando cose diverse. Aspetta un po 'e invio una risposta. Per i flag di compilazione, c'è un modo impuro ma semplice: add_definitions ("- truc") – Offirmo

+0

Per una discussione più aggiornata su questa domanda (specialmente se si sta usando CMake 3.xo più recente): [Qual è il metodo moderno per l'impostazione di flag di compilazione generali in CMake?] (http://stackoverflow.com/questions/23995019/what-is-the-modern-method-for-setting-general-compile-flags-in-cmake/23995391# 23.995.391). – ComicSansMS

risposta

167

si supponga di voler aggiungere quelle bandiere (meglio dichiarare loro in una costante):

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

Ci sono diversi modi per aggiungere loro:

  1. Il più semplice (non pulita, ma facile e conveniente, funziona solo per flag di compilazione, C & C++ in una volta):

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS}) 
    
  2. Accodamento a corrispondenti variabili cmake

    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. Utilizzando proprietà bersaglio, cf. doc cmake compile flag target property e devi conoscere il nome del target.

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

In questo momento mi Metodo 2 Utilizzare.

+2

perché è add_definitions() sporca? –

+8

@leinaD_natipaC: la [documentazione ufficiale] (http://www.cmake.org/cmake/help/v3.0/command/add_definitions.html) dice: _Questo comando può essere usato per aggiungere qualsiasi flag, ma è inteso per aggiungere definizioni di preprocessore_. Penso che sia il motivo. –

24

provare a impostare la variabile CMAKE_CXX_FLAGS invece di CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions") 

La variabile CMAKE_C_FLAGS influisce solo il compilatore C, ma la compilazione di codice C++.

L'aggiunta del flag a CMAKE_EXE_LINKER_FLAGS è ridondante.

+0

ho provato, ma dà ancora errore. È impostato (CMAKE_CXX_FLAGS "-fexceptions") l'unico modo per specificare il flag del compilatore. – solti

+2

ho risolto il problema ma non è un buon modo per aggirare il problema .. ho fatto -DCMAKE_CXX_FLAGS = "-fexceptions" nella riga di comando. per qualche motivo cmake non sta leggendo i flag dal file .cmake. :(.. grazie sakra per la risposta .. – solti

+7

-DCMAKE_CXX_FLAGS = "-fexceptions" Non ci dovrebbe essere uno spazio tra il = e " – evandrix

76

Nelle versioni più recenti di CMake è possibile anche impostare compilatore e linker bandiere per un singolo bersaglio utilizzando target_compile_options e target_link_libraries, rispettivamente (sì, questi ultimi set linker opzioni troppo):

target_compile_options(first-test PRIVATE -fexceptions) 

Il vantaggio di questo metodo è che puoi controllare la propagazione delle opzioni ad altri target che dipendono da questo tramite PUBLIC e PRIVATE.

+1

I ' ho provato ad usarlo: 'target_compile_options (main_static PRIVATE --static)' ma non sembra funzionare, nessuna idea perché? –

+2

'-static' è probabilmente un linke r, non opzione del compilatore. Prova a passarlo a 'target_link_libraries'. – vitaut

+6

Oh, 'target_link_libraries' Ho perso quella parte di doc:" Specifica librerie ** o contrassegni ** da utilizzare quando si collega un dato target. ". Grazie. –

Problemi correlati