Spec-Zone.ru › CMake 3.23

IMPORTED_OBJECTS

Новое в версии 3.9.

Список абсолютных путей к объектным файлам на диске, разделённых точкой с запятой, для импортированной библиотеки объектных файлов.

Игнорируется для неимпортированных целей.

Проекты могут пропустить IMPORTED_OBJECTS , если свойство, зависящее от конфигурации, IMPORTED_OBJECTS_<CONFIG> задано вместо этого, за исключением случаев, указанных в разделе ниже.

Учитывание генератора Xcode

Новое в версии 3.20.

Для платформ Apple проект может быть скомпилирован для нескольких архитектур. Это контролируется переменной CMAKE_OSX_ARCHITECTURES. Для всех генераторов, кроме генератора Xcode, CMake вызывает компиляторы один раз на каждый исходный файл и передаёт несколько -arch флагов, что приводит к одному объектному файлу, который будет универсальной бинарной. Такие объектные файлы хорошо работают, когда перечислены в IMPORTED_OBJECTS отдельного CMake-сборки, даже для генератора Xcode. Но создание таких объектных файлов с генератором Xcode сложнее, поскольку он вызывает компилятор один раз на каждую архитектуру для каждого исходного файла. В отличие от других генераторов, он не генерирует универсальные бинарные файлы объектных файлов.

Ещё одна сложность с генератором Xcode заключается в том, что при работе с платформами устройств (iOS, tvOS или watchOS), генератор Xcode имеет возможность использовать либо SDK устройства, либо SDK симулятора, без необходимости повторного выполнения CMake. SDK можно выбрать во время сборки. Но поскольку некоторые архитектуры могут быть поддерживаемы как SDK устройства, так и SDK симулятора (например, arm64 с Xcode 12 или новее), не все комбинации могут быть представлены в одной универсальной двоичной. В этом случае единственным решением является наличие нескольких объектных файлов.

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

В некоторых случаях может потребоваться использовать объектные файлы, специфичные для конфигурации. Переменная 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, а аспекты, специфичные для конфигурации, должны быть обработаны переменной Xcode $(CONFIGURATION).

© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/prop_tgt/IMPORTED_OBJECTS.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API