Estoy usando el arm-linux-androideabi-g++compilador. Cuando trato de compilar un simple "¡Hola, mundo!" programa se compila bien. Cuando lo pruebo agregando un manejo de excepciones simple en ese código, también funciona (después de agregar -fexceptions... Supongo que está deshabilitado por defecto).
Esto es para un dispositivo Android, y solo quiero usar CMake, no ndk-build.
Por ejemplo - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Funciona sin problema ...
El problema ... Estoy tratando de compilar el archivo con un archivo CMake.
Quiero agregar el -fexceptionscomo una bandera. Lo intenté con
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
y
set ( CMAKE_C_FLAGS "fexceptions")
Todavía muestra un error.

Respuestas:
Supongamos que desea agregar esas banderas (mejor declararlas en una constante):
Hay varias formas de agregarlos:
El más fácil (no limpio, pero fácil y conveniente, y funciona solo para compilar banderas, C & C ++ a la vez):
Anexar a las variables CMake correspondientes:
Usando las propiedades de destino, cf. doc CMake compila la propiedad de destino del indicador y necesita saber el nombre del objetivo.
En este momento uso el método 2.
fuente
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")es más corto y más limpio queset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")En las versiones más recientes de CMake, puede establecer marcas de compilador y vinculador para un solo objetivo con
target_compile_optionsytarget_link_librariesrespectivamente (sí, este último también establece opciones de vinculador):La ventaja de este método es que puede controlar la propagación de opciones a otros objetivos que dependen de este mediante
PUBLICyPRIVATE.A partir de CMake 3.13, también puede usarlo
target_link_optionspara agregar opciones de enlazador, lo que aclara la intención.fuente
target_compile_options(main_static PRIVATE --static)pero no parece funcionar, ¿alguna idea de por qué?-statices probablemente una opción de vinculador, no compilador. Intenta pasárselo atarget_link_libraries.target_link_librariesme perdí esa parte del documento: "Especificar bibliotecas o banderas para usar al vincular un objetivo determinado". Gracias.target_link_optionscomo una forma más limpia de especificar banderas de enlace. Debe evitar el usotarget_link_librariesde indicadores de vinculador en el futuro y utilizarlotarget_link_optionsen su lugar.Intente configurar la variable en
CMAKE_CXX_FLAGSlugar deCMAKE_C_FLAGS:La variable
CMAKE_C_FLAGSsolo afecta al compilador de C, pero está compilando código de C ++.Agregar la bandera a
CMAKE_EXE_LINKER_FLAGSes redundante.fuente
También puede agregar indicadores de vinculador a un objetivo específico utilizando la
LINK_FLAGSpropiedad:Si desea propagar este cambio a otros objetivos, puede crear un objetivo ficticio para vincularlo.
fuente
Partida de los ucm_add_flags y ucm_add_linker_flags macros de la UCM (mi conjunto de macros CRealice útiles) - Se refieren a anexas banderas de compilador / enlazador.
fuente