BUILD_SHARED_LIBS

指示 add_library() 在调用时若未指定库类型,则默认使用 SHARED(动态库)而非 STATIC(静态库)。

当调用 add_library() 且未指定库类型时,会检查当前 BUILD_SHARED_LIBS 变量的值。如果为 true,则默认库类型为 SHARED。否则,默认值为 STATIC

例如,以下代码:

add_library(example ${sources})

其行为就像是写成了

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

CMake 默认不会定义 BUILD_SHARED_LIBS,但项目通常会使用 option() 命令为其创建缓存条目。

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

这提供了一个用户可以控制的开关,例如通过 cmake -D。如果在项目中添加此类选项,请在顶级 CMakeLists.txt 文件中,且在任何 add_library() 调用之前进行设置。请注意,如果直接将外部依赖项引入构建(例如使用 FetchContent 或直接调用 add_subdirectory()),并且其中某个依赖项包含了对此类 option(BUILD_SHARED_LIBS ...) 的调用,那么顶级项目也必须在引入这些依赖项之前调用 option(BUILD_SHARED_LIBS ...)。如果不这样做,可能会导致首次运行 CMake 与后续运行之间的行为不一致。