BUILD_SHARED_LIBSΒΆ

Tell add_library() to default to SHARED libraries, instead of STATIC libraries, when called with no explicit library type.

Calls to add_library() without any explicit library type check the current BUILD_SHARED_LIBS variable value. If it is true, then the default library type is SHARED. Otherwise, the default is STATIC.

For example, the code:

add_library(example ${sources})

behaves as if written

if(BUILD_SHARED_LIBS)
  add_library(example SHARED ${sources})
else()
  add_library(example STATIC ${sources})
endif()

CMake does not define BUILD_SHARED_LIBS by default, but projects often create a cache entry for it using the option() command:

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

This provides a switch that users can control, e.g., with cmake -D. If adding such an option to the project, do so in the top level CMakeLists.txt file, before any add_library() calls. Note that if bringing external dependencies directly into the build, such as with FetchContent or a direct call to add_subdirectory(), and one of those dependencies has such a call to option(BUILD_SHARED_LIBS ...), the top level project must also call option(BUILD_SHARED_LIBS ...) before bringing in its dependencies. Failure to do so can lead to different behavior between the first and subsequent CMake runs.