2012-07-27 10 views
6

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!

Respuesta

11

Para forzar el módulo CMake FindBoost para buscar las bibliotecas deseados de nuevo, se deben eliminar las variables de caché Boost_INCLUDE_DIR y Boost_LIBRARY_DIRS, es decir:

set(Boost_USE_STATIC_LIBS ${USE_STATIC_BOOST}) 
set(Boost_USE_MULTITHREADED ON) 
unset(Boost_INCLUDE_DIR CACHE) 
unset(Boost_LIBRARY_DIRS CACHE) 
find_package(Boost REQUIRED COMPONENTS thread program_options system) 
if(USE_STATIC_BOOST) 
    message(STATUS "Linking against boost static libraries") 
else(USE_STATIC_BOOST) 
    message(STATUS "Linking against boost dynamic libraries") 
endif(USE_STATIC_BOOST) 

Tenga en cuenta que el argumento CACHE es necesario hacer el comando unset borrar las variables en la memoria caché.

También tenga en cuenta que una vez que la opción variable de USE_STATIC_BOOST ha almacenado en caché, es necesario establecer explícitamente la variable desde la línea de comandos o editar el valor en el archivo de caché para hacer CMake notar el cambio:

cmake ../.. -DUSE_STATIC_BOOST=NO 
+1

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

+0

@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

+0

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

Cuestiones relacionadas