BUILD_SHARED_LIBS — CMake 3.31.1 Documentation

# 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.