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 变量处理。