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 變數處理。