cmake - libreria - descargar opencv para windows 10
¿Cómo agregar un enlazador o un indicador de compilación en el archivo cmake? (5)
Estoy usando el compilador arm-linux-androideabi-g++
. Cuando intento compilar un programa simple de "hello world" compila bien. Cuando lo -fexceptions
agregando un manejo de excepción 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
not 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 problemas ..
El problema ... Estoy intentando compilar el archivo con un archivo cmake.
Quiero agregar las -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.
En las versiones más nuevas de CMake, también puede establecer indicadores de compilador y enlazador para un objetivo único utilizando target_compile_options
y target_link_libraries
respectivamente (sí, este último también establece las opciones del enlazador):
target_compile_options(first-test PRIVATE -fexceptions)
La ventaja de este método es que puede controlar la propagación de opciones a otros destinos que dependen de este a través de PUBLIC
y PRIVATE
.
Intente configurar la variable CMAKE_CXX_FLAGS
lugar de CMAKE_C_FLAGS
:
set (CMAKE_CXX_FLAGS "-fexceptions")
La variable CMAKE_C_FLAGS
solo afecta al compilador de C, pero está compilando el código de C ++.
Agregar el indicador a CMAKE_EXE_LINKER_FLAGS
es redundante.
Supongamos que desea agregar esos indicadores (mejor para declararlos en una constante):
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
Hay varias formas de agregarlos:
El más fácil (no limpio, fácil y conveniente, funciona solo para indicadores de compilación, C & C ++ a la vez):
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
Anexando a las correspondientes variables 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}" )
Usando las propiedades del objetivo, cf. doc cmake compila propiedad de destino de indicador y necesita conocer el nombre del objetivo.
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} )
En este momento utilizo el método 2.
También puede agregar indicadores del enlazador a un objetivo específico utilizando la propiedad LINK_FLAGS
:
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")
Si desea propagar este cambio a otros destinos, puede crear un objetivo ficticio para vincularlo.
ucm_add_linker_flags macros ucm_add_flags y ucm_add_linker_flags de mi (mi conjunto de macros cmake útiles) - se ocupan de agregar banderas de compilador / enlazador