2012-08-02 14 views
137

Używam kompilatora arm-linux-androideabi-g++. Kiedy próbuję skompilować prosty program "cześć świat", kompiluje się dobrze. Kiedy go przetestować, dodając prostą obsługę w tym kodzie to działa zbyt wyjątek (po dodaniu -fexceptions .. Myślę, że to jest domyślnie wyłączone)Jak dodać linker lub kompilować flagę w pliku cmake?

Jest to dla Android urządzenia i chcę tylko korzystać cmake nie ndk-build

Na przykład - first.cpp

#include <iostream> 

using namespace std; 

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

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

działa bez problemu ..

Problem .. Próbuję skompilować plik przy pomocy pliku cmake.

Chcę dodać -fexceptions jako flagę. Próbowałem z

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

i

set (CMAKE_C_FLAGS "fexceptions") 

Nadal wyświetla błąd.

+0

teraz mam ten sam problem, i próbuję różnych rzeczy. Poczekaj chwilę i opublikuję odpowiedź. Dla flag kompilacji istnieje nieczysty, ale łatwy sposób: add_definitions ("- truc") – Offirmo

+0

Aby uzyskać bardziej aktualną dyskusję na temat tego pytania (szczególnie jeśli używasz CMake 3.x lub nowszego): [Co to jest nowoczesna metoda ustawiania ogólnych flag kompilacji w CMake?] (http://stackoverflow.com/questions/23995019/what-is-the-modern-method-for-setting-general-compile-flags-in-cmake/23995391# 23995391). – ComicSansMS

Odpowiedz

167

Załóżmy, że chcemy dodać te flagi (lepiej zadeklarować je w stałym):

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

Istnieje kilka sposobów, aby je dodać:

  1. Najprostszym jeden (nie czyste, ale łatwe i wygodne, działa tylko dla kompilacji flagi, C++ C & naraz):

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS}) 
    
  2. Dołączanie do odpowiednich zmiennych cUpewnij

    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. Użycie właściwości docelowych por doc cmake compile flag target property i trzeba znać nazwę celu.

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

Teraz używam metody 2.

+2

dlaczego jest add_definitions() nieczytelny? –

+8

@leinaD_natipaC: [dokumentacja urzędowa] (http: // /www.cmake.org/cmake/help/v3.0/command/add_definitions.html) mówi: _ Ta komenda może być użyta do dodania dowolnych flag, ale jest przeznaczona do dodania definicji preprocesora_. Myślę, że właśnie dlatego ... –

24

Spróbuj ustawić zmienną CMAKE_CXX_FLAGS zamiast CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions") 

Zmienna CMAKE_C_FLAGS dotyczy tylko kompilator C, ale są kompilacji kodu C++.

Dodanie flagi do CMAKE_EXE_LINKER_FLAGS jest zbędne.

+0

Próbowałem, ale nadal daje błąd. Jest ustawiony (CMAKE_CXX_FLAGS "-fexceptions") jedynym sposobem określenia flagi kompilatora. – solti

+2

Rozwiązałem problem, ale nie był to dobry sposób jego złego obejścia .. Zrobiłem -DCMAKE_CXX_FLAGS = "-wykres" w linii poleceń. z jakiegoś powodu cmake nie czyta flag z pliku .cmake. :(.. dziękuję sakra za odpowiedź .. – solti

+7

-DCMAKE_CXX_FLAGS = "-wystawy" NIE powinien być odstępu między znakami = i " – evandrix

76

W nowszych wersjach CMake Można również ustawić kompilatora i linkera flagi na jednym celu, używając target_compile_options i target_link_libraries odpowiednio (tak, te ostatnie zestawy Linker opcje zbyt):

target_compile_options(first-test PRIVATE -fexceptions) 

Zaletą tej metody jest to, że możesz kontrolować propagację opcji do innych obiektów docelowych, które zależą od tego poprzez PUBLIC i PRIVATE.

+1

ve próbował go użyć: 'target_compile_options (main_static PRIVATE --static)' ale nie wydaje się działać, każdy pomysł dlaczego? –

+2

'-static' jest prawdopodobnie linke r, nie opcja kompilatora. Spróbuj przekazać go do 'target_link_libraries'. – vitaut

+6

Och, 'target_link_libraries' Opuściłem tę część dokumentu:" Określ biblioteki ** lub flagi ** do użycia podczas łączenia danego celu. ". Dzięki. –

Powiązane problemy