Jak dodać flagę linkera lub kompilacji w pliku CMake?

Używam kompilatora arm-linux-androideabi-g++. Kiedy próbuję skompilować prosty "Hello, World!"program dobrze komponuje. Kiedy testuję to dodając prostą obsługę wyjątków w tym kodzie to też działa (po dodaniu -fexceptions.. Domyślam się, że jest domyślnie wyłączona).

To jest dla Urządzenia z Androidem, i chcę używać tylko CMake, a 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

To działa bez problemu...

Problem ... Próbuję skompilować Plik z plikiem 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.

 155
Author: Peter Mortensen, 2012-08-02

5 answers

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

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

Istnieje kilka sposobów, aby je dodać:

  1. Najprostszy (Nie czysty, ale łatwy i wygodny, i działa tylko dla FLAG kompilacji, C & C++ na raz):

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
    
  2. Dołączanie do odpowiednich zmiennych 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. Używając właściwości docelowych, por. Doc CMake kompiluje właściwość FLAG target I musi znać cel nazwisko.

    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.

 184
Author: Offirmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-22 20:24:03

W nowszych wersjach CMake można również ustawić flagi kompilatora i linkera dla pojedynczego celu za pomocą target_compile_options Oraz target_link_libraries odpowiednio (tak, ten ostatni również ustawia opcje linkera):

target_compile_options(first-test PRIVATE -fexceptions)

Zaletą tej metody jest to, że można kontrolować propagację opcji do innych celów, które zależą od tego za pomocą PUBLIC i PRIVATE.

 98
Author: vitaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 14:31:07

Spróbuj ustawić zmienną CMAKE_CXX_FLAGS zamiast CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

Zmienna CMAKE_C_FLAGS dotyczy tylko kompilatora C, ale kompilujesz kod C++.

Dodanie flagi do {[4] } jest zbędne.

 29
Author: sakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 19:27:56

Można również dodać flagi linkera DO OKREŚLONEGO CELU za pomocą właściwości LINK_FLAGS:

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

Jeśli chcesz propagować tę zmianę na inne cele, możesz utworzyć atrapę celu, do którego chcesz się połączyć.

 0
Author: kaveish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 14:29:07

Sprawdź makra ucm_add_flags i ucm_add_linker_flags z ucm (mój zestaw użytecznych makr CMake) - zajmują się dodawaniem flag kompilatora/linkera.

 0
Author: onqtam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-22 20:25:51