UNITY_BUILD

在版本 3.16 中加入。

當此屬性設定為 true 時,目標原始碼檔案將會組合成批次以加速編譯。這是透過建立(一組)Unity 原始碼來完成,這些原始碼 #include 原始來源,然後編譯這些 Unity 原始碼,而不是原始來源。這被稱為 UnityJumbo 建置。

CMake 提供了不同的演算法來選擇哪些原始碼被分組到一個bucket 中。演算法選擇由 UNITY_BUILD_MODE 目標屬性決定,該屬性具有以下可接受的值

  • BATCH 在此模式下,CMake 決定哪些檔案被分組在一起。UNITY_BUILD_BATCH_SIZE 屬性控制每個 Unity 原始碼檔案可以組合的原始碼數量上限。

  • GROUP 在此模式下,每個目標明確指定如何分組原始碼檔案。每個具有相同 UNITY_GROUP 值的原始碼檔案將被分組在一起。任何沒有此屬性的原始碼將會個別編譯。UNITY_BUILD_BATCH_SIZE 屬性在使用此模式時會被忽略。

如果沒有明確指定 UNITY_BUILD_MODE,CMake 將預設為 BATCH

以下語言支援 Unity 建置

C

在版本 3.16 中加入。

CXX

在版本 3.16 中加入。

CUDA

在版本 3.31 中加入。

OBJC

在版本 3.29 中加入。

OBJCXX

在版本 3.29 中加入。

對於混合來自多種語言的原始碼檔案的目標,CMake 會分離語言,以便每個產生的 Unity 原始碼檔案僅包含單一語言的原始碼。

此屬性由建立目標時 CMAKE_UNITY_BUILD 變數的值初始化。

注意

專案不應直接將 UNITY_BUILD 屬性或其相關聯的 CMAKE_UNITY_BUILD 變數設定為 true。根據所使用的建置機器和編譯器的功能,啟用 Unity 建置可能適合也可能不適合。因此,此功能應受開發人員控制,這通常是透過開發人員選擇是否在 CMAKE_UNITY_BUILD 變數在 cmake(1) 命令列上或其他等效方法中設定。但是,如果已知為目標啟用 Unity 建置可能會導致問題,則建議將 UNITY_BUILD 目標屬性設定為 false。

ODR (單一定義規則) 錯誤

當多個原始碼檔案包含到一個原始碼檔案中時,就像 Unity 建置一樣,這可能會導致 ODR 錯誤。CMake 提供了許多措施來幫助解決此類問題