IMPORTED_OBJECTS¶
加入於版本 3.9。
一個以分號分隔的列表,包含磁碟上物件檔案的絕對路徑,適用於imported 物件函式庫。
對於非 imported 目標會被忽略。
專案可以跳過 IMPORTED_OBJECTS
,如果設定了組態特定的屬性 IMPORTED_OBJECTS_<CONFIG>
,除非在以下章節中說明的狀況。
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 變數處理。