Back to Cmake

BUILD_SHARED_LIBS

Help/variable/BUILD_SHARED_LIBS.rst

4.3.21.5 KB
Original Source

BUILD_SHARED_LIBS

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

Calls to :command: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:

.. code-block:: cmake

add_library(example ${sources})

behaves as if written

.. code-block:: cmake

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 :command:option command:

.. code-block:: cmake

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

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