How can I optionally link against static or dynamic boost library using CMake?

boost, c++, cmake

Solution

To force the FindBoost CMake module to search for the desired libraries again, you have to clear the cache variables `Boost_INCLUDE_DIR` and `Boost_LIBRARY_DIRS`, i.e.:

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()
   message(STATUS "Linking against boost dynamic libraries")
endif()

Note that the argument `CACHE` is necessary to make the unset command clear the variables in the cache.

Also note that once the option variable `USE_STATIC_BOOST` has been cached, you need to explicitly set the variable from the command line or edit the value in the cache file to make CMake notice the change:

cmake ../.. -DUSE_STATIC_BOOST=NO 

Problem

I have a CMake project that I sometimes want to compile against the static boost libraries, but I want to also make it easy to just use the dynamic libraries from the cmake GUI. In my top level CMakeLists.txt I have this: ``` option(USE_STATIC_BOOST "Build with static BOOST libraries instead of dynamic" NO) ``` Then in a different file, I have the following logic set up: ``` 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) ``` This seems to work fine if I start from scratch and use: ``` cmake ../.. -DUSE_STATIC_BOOST=YES ``` However, when I use ``` ccmake ../.. ``` I cannot get it to use the static libraries no matter what I do. CMake appears to load the dynamic option into cache on startup and changing USE_STATIC_BOOST doesn't switch it. I even tried to unset(Boost_LIBRARIES) to explicitly clear it out. Is there a way to do what I'm trying to do? Using x86_64 Linux and g++ to compile. Thanks in advance!

Original source