IMPORTED_OBJECTS

新增於 3.9 版本。

一個以分號分隔的清單,包含導入的物件庫在磁碟上的物件檔案的絕對路徑。

對於非導入目標會被忽略。

如果設定了特定於組態的屬性 IMPORTED_OBJECTS_<CONFIG>,專案可以跳過 IMPORTED_OBJECTS,但以下章節所述的情況除外。

Xcode 產生器注意事項

新增於 3.20 版本。

對於 Apple 平台,一個專案可能會針對多個架構進行建置。這由 CMAKE_OSX_ARCHITECTURES 變數控制。對於除了 Xcode 產生器之外的所有產生器,CMake 會針對每個原始碼檔案調用編譯器一次,並傳遞多個 -arch 標誌,產生一個單一的物件檔案,這會是一個通用二進位檔。當在另一個 CMake 建置的 IMPORTED_OBJECTS 中列出時,此類物件檔案可以正常運作,即使對於 Xcode 產生器也是如此。但是使用 Xcode 產生器產生此類物件檔案會更加困難,因為它會針對每個原始碼檔案的每個架構調用編譯器一次。與其他產生器不同,它不會產生通用物件檔案二進位檔。

關於 Xcode 產生器的另一個複雜之處是,當目標為裝置平台(iOS、tvOS、visionOS 或 watchOS)時,Xcode 產生器有能力使用裝置或模擬器 SDK,而不需要重新執行 CMake。SDK 可以在建置時選取。但是,由於某些架構可以同時被裝置和模擬器 SDK 支援(例如使用 Xcode 12 或更高版本的 arm64),因此並非所有組合都可以在單一通用二進位檔中表示。在這種情況下,唯一的解決方案是擁有多個物件檔案。

IMPORTED_OBJECTS 不支援產生器表達式,因此它列出的每個檔案都需要對每個架構和 SDK 都有效。如果包含非通用二進位檔的物件檔案,則每個物件檔案的路徑和/或檔案名稱必須以某種方式封裝不同的架構和 SDK。使用 Xcode 產生器,可以使用 $(...) 形式的 Xcode 變數來表示這些方面,並且 Xcode 會在建置時替換適當的值。CMake 不會解釋這些變數,並將它們不變地嵌入到 Xcode 專案檔案中。$(CURRENT_ARCH) 可用於表示架構,而 $(EFFECTIVE_PLATFORM_NAME) 可用於區分 SDK。

以下範例顯示如何使用這兩個變數來引用物件檔案,其位置取決於 SDK 和架構

add_library(someObjs OBJECT IMPORTED)

set_property(TARGET someObjs PROPERTY IMPORTED_OBJECTS
  # Quotes are required because of the ()
  "/path/to/somewhere/objects$(EFFECTIVE_PLATFORM_NAME)/$(CURRENT_ARCH)/func.o"
)

# Example paths:
#   /path/to/somewhere/objects-iphoneos/arm64/func.o
#   /path/to/somewhere/objects-iphonesimulator/x86_64/func.o

在某些情況下,您可能也希望擁有特定於組態的物件檔案。 $(CONFIGURATION) Xcode 變數通常用於此目的,並且可以與上面提到的其他變數一起使用

add_library(someObjs OBJECT IMPORTED)
set_property(TARGET someObjs PROPERTY IMPORTED_OBJECTS
  "/path/to/somewhere/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(CURRENT_ARCH)/func.o"
)

# Example paths:
#   /path/to/somewhere/Release-iphoneos/arm64/func.o
#   /path/to/somewhere/Debug-iphonesimulator/x86_64/func.o

當使用任何 Xcode 變數時,CMake 無法在設定時完全評估路徑。這樣做的後果之一是無法使用特定於組態的 IMPORTED_OBJECTS_<CONFIG> 屬性,因為 CMake 無法確定物件檔案是否存在於特定的 <CONFIG> 位置。在這些情況下,必須使用 IMPORTED_OBJECTS 屬性,並且路徑的特定於組態的方面應由 $(CONFIGURATION) Xcode 變數處理。