Korzystam z arm-linux-androideabi-g++
kompilatora. Kiedy próbuję skompilować proste „Witaj, świecie!” program kompiluje się dobrze. Kiedy go testuję, dodając prostą obsługę wyjątków w tym kodzie, on również działa (po dodaniu -fexceptions
.. Myślę, że jest domyślnie wyłączony).
To jest dla urządzenia z Androidem i chcę tylko używać 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
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.
Odpowiedzi:
Załóżmy, że chcesz dodać te flagi (lepiej zadeklarować je na stałe):
Istnieje kilka sposobów ich dodania:
Najłatwiejszy (nie czysty, ale łatwy i wygodny, działa tylko na flagi kompilacji, C i C ++ jednocześnie):
Dołączanie do odpowiednich zmiennych CMake:
Używając właściwości docelowych, por. doc CMUtwórz właściwość docelową flagi kompilacji i musisz znać nazwę celu.
Teraz używam metody 2.
źródło
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
jest krótszy i czystszy niżset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
W nowszych wersjach CMake możesz ustawić flagi kompilatora i linkera dla pojedynczego celu odpowiednio
target_compile_options
itarget_link_libraries
(tak, ten drugi ustawia również opcje linkera):Zaletą tej metody jest to, że można kontrolować propagację opcji do innych celów zależnych od tego za pośrednictwem
PUBLIC
iPRIVATE
.Począwszy od CMake 3.13 możesz także użyć
target_link_options
opcji dodania linkera, dzięki czemu intencja jest bardziej przejrzysta.źródło
target_compile_options(main_static PRIVATE --static)
ale wydaje się, że to nie działa, jakiś pomysł, dlaczego?-static
jest prawdopodobnie linkerem, a nie opcją kompilatora. Spróbuj przekazać totarget_link_libraries
.target_link_libraries
tęskniłem za tą częścią dokumentu: „Określ biblioteki lub flagi, które mają być używane podczas łączenia danego celu”. Dzięki.target_link_options
jako czystszy sposób określania flag linkera. Wtarget_link_libraries
przyszłości powinieneś unikać używania flag flag linkerów itarget_link_options
zamiast tego używaj .Spróbuj ustawić zmienną
CMAKE_CXX_FLAGS
zamiastCMAKE_C_FLAGS
:Zmienna
CMAKE_C_FLAGS
wpływa tylko na kompilator C, ale kompilujesz kod C ++.Dodanie flagi
CMAKE_EXE_LINKER_FLAGS
jest zbędne.źródło
Możesz także dodać flagi linkera do określonego celu, używając
LINK_FLAGS
właściwości:Jeśli chcesz propagować tę zmianę do innych celów, możesz utworzyć fikcyjny cel, z którym chcesz się połączyć.
źródło
Zamówienie na ucm_add_flags i ucm_add_linker_flags makra z UCM (mój zestaw przydatnych makr CUpewnij) - radzą sobie z załączonych flagi kompilatora / linkera.
źródło