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 -fexceptions
como 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_options
ytarget_link_libraries
respectivamente (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
PUBLIC
yPRIVATE
.A partir de CMake 3.13, también puede usarlo
target_link_options
para 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é?-static
es probablemente una opción de vinculador, no compilador. Intenta pasárselo atarget_link_libraries
.target_link_libraries
me perdí esa parte del documento: "Especificar bibliotecas o banderas para usar al vincular un objetivo determinado". Gracias.target_link_options
como una forma más limpia de especificar banderas de enlace. Debe evitar el usotarget_link_libraries
de indicadores de vinculador en el futuro y utilizarlotarget_link_options
en su lugar.Intente configurar la variable en
CMAKE_CXX_FLAGS
lugar deCMAKE_C_FLAGS
:La variable
CMAKE_C_FLAGS
solo afecta al compilador de C, pero está compilando código de C ++.Agregar la bandera a
CMAKE_EXE_LINKER_FLAGS
es redundante.fuente
También puede agregar indicadores de vinculador a un objetivo específico utilizando la
LINK_FLAGS
propiedad: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