Tengo un proyecto CMake que a veces quiero compilar contra las bibliotecas de refuerzo estático, pero también quiero que sea fácil usar las bibliotecas dinámicas de la GUI de cmake. En mi top CMakeLists.txt nivel tengo esto:¿Cómo puedo enlazar opcionalmente contra la biblioteca de impulso estático o dinámico usando CMake?
option(USE_STATIC_BOOST "Build with static BOOST libraries instead of dynamic" NO)
Luego, en un archivo diferente, yo he dado la siguiente lógica hasta:
if(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost static libraries")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
else(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost dynamic libraries")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
endif(USE_STATIC_BOOST)
Esto parece funcionar bien si comienzo desde cero y utilizar:
cmake ../.. -DUSE_STATIC_BOOST=YES
Sin embargo, cuando uso
ccmake ../..
No puedo hacer que use las bibliotecas estáticas sin importar lo que haga. CMake parece cargar la opción dinámica en la caché al inicio y al cambiar USE_STATIC_BOOST no la cambia. Incluso intenté desarmar (Boost_LIBRARIES) para borrarlo explícitamente. ¿Hay alguna forma de hacer lo que estoy tratando de hacer?
Usando x86_64 Linux y g ++ para compilar. ¡Gracias por adelantado!
Perfecto - eso funcionó muy bien, gracias! Pregunta de seguimiento: ¿Sabe por qué la configuración de Boost_USE_STATIC_LIBS a ON/OFF debe ocurrir en el mismo ámbito que find_package? Si saco find_package del bloque if/else/endif anterior, no respeta el indicador Boost_USE_STATIC_LIBS. – KyleL
@KdawgUD Me funciona incluso si el alcance no es el mismo. De todos modos, se puede evitar la mayor parte de la duplicación de código en la sentencia if-else (ver respuesta actualizada) – sakra
Gracias de nuevo por la ayuda. Pude haber estado luchando contra el problema del caché cuando estaba viendo lo que yo pensaba que era un problema de alcance. Tomé su sugerencia para eliminar el código duplicado. ¡Aclamaciones! – KyleL