Selecting Static or Shared Libraries — CMake 4.0.2 Documentation (original) (raw)
In this section we will show how the BUILD_SHARED_LIBS variable can be used to control the default behavior of add_library(), and allow control over how libraries without an explicit type (STATIC
,SHARED
, MODULE
or OBJECT
) are built.
To accomplish this we need to add BUILD_SHARED_LIBS to the top-level CMakeLists.txt
. We use the option() command as it allows users to optionally select if the value should be ON
or OFF
.
Next, we need to specify output directories for our static and shared libraries.
CMakeLists.txt¶
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
Finally, update MathFunctions/MathFunctions.h
to use dll export defines:
MathFunctions/MathFunctions.h¶
#if defined(_WIN32)
if defined(EXPORTING_MYMATH)
define DECLSPEC __declspec(dllexport)
else
define DECLSPEC __declspec(dllimport)
endif
#else // non windows
define DECLSPEC
#endif
namespace mathfunctions { double DECLSPEC sqrt(double x); }
At this point, if you build everything, you may notice that linking fails as we are combining a static library without position independent code with a library that has position independent code. The solution to this is to explicitly set the POSITION_INDEPENDENT_CODE target property of SqrtLibrary to be True
when building shared libraries.
MathFunctions/CMakeLists.txt¶
state that SqrtLibrary need PIC when the default is shared libraries
set_target_properties(SqrtLibrary PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS} )
Define EXPORTING_MYMATH
stating we are using declspec(dllexport)
when building on Windows.
MathFunctions/CMakeLists.txt¶
define the symbol stating we are using the declspec(dllexport) when
building on windows
target_compile_definitions(MathFunctions PRIVATE "EXPORTING_MYMATH")
Exercise: We modified MathFunctions.h
to use dll export defines. Using CMake documentation can you find a helper module to simplify this?