BUILD_SHARED_LIBS

告知 add_library() 在未明確指定函式庫類型時,預設使用 SHARED 函式庫,而非 STATIC 函式庫。

當呼叫 add_library() 且未明確指定函式庫類型時,會檢查目前的 BUILD_SHARED_LIBS 變數值。如果為真,則預設函式庫類型為 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 執行之間出現不同的行為。