IMPORTED_OBJECTS

3.9 版本中添加。

一个 以分号分隔的列表,包含一个 导入的 object 库 在磁盘上的 object 文件的绝对路径。

对于非导入的目标忽略。

如果设置了配置特定的属性 IMPORTED_OBJECTS_<CONFIG>,则项目可以跳过 IMPORTED_OBJECTS,以下部分中列出的情况除外。

Xcode 生成器考虑事项

3.20 版本中添加。

对于 Apple 平台,项目可以为多个架构构建。这由 CMAKE_OSX_ARCHITECTURES 变量控制。对于所有 Xcode 生成器,CMake 都会调用一次编译器来处理每个源文件,并传递多个 -arch 标志,从而生成一个通用二进制文件的 object 文件。此类 object 文件非常适用于在单独的 CMake 构建的 IMPORTED_OBJECTS 中列出,即使是对于 Xcode 生成器亦是如此。但是,使用 Xcode 生成器生成此类 object 文件则更困难,因为它针对每个源文件为每一个架构调用编译器一次。它不会像其他生成器一样生成通用的 object 文件二进制文件。

对于 Xcode 生成器,另外一个复杂之处是当针对设备平台(iOS、tvOS、visionOS 或 watchOS)时,Xcode 生成器既可以使用设备 SDK,也可以使用模拟器 SDK,而无需重新运行 CMake。可以在构建时选择 SDK。但是,由于某些架构既可以由设备 SDK 又可以由模拟器 SDK 支持(例如,使用 Xcode 12 或更高版本的 arm64),因此无法在一个通用二进制文件中表示所有组合。在这种情况下,唯一的解决办法就是拥有多个 object 文件。

IMPORTED_OBJECTS 不支持 generator expression,因此其列出的每个文件都需要对每个体系结构和 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

在某些情况下,您可能也希望有特定于配置的目标文件。Xcode 变量 $(CONFIGURATION) 通常会用于此目的,并且可以与上述其他变量结合使用

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