CMake shared libraries on Visual Studio / oneAPI

CMake requires target parameter WINDOWS_EXPORT_ALL_SYMBOLS set to true to properly use shared libraries on Windows with Visual Studio or Intel oneAPI (which uses Visual Studio as a backend on Windows). For convenience CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS sets all targets default parameter. Without this parameter, linking fails because the “.lib” import library isn’t created with the exported shared library symbols.

An example CMakeLists.txt where this parameter is needed to build successfully with Visual Studio or Intel oneAPI on Windows:

set(BUILD_SHARED_LIBS true)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true)
# must be before all targets

add_library(a a.c)
add_library(b b.c)

target_link_libraries(b PRIVATE a)

It’s also possible to set this parameter for individual targets like:

set_property(TARGET a PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS true)