Spec-Zone.ru › CMake 3.28

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, visionOS или watchOS), генератор Xcode может использовать либо SDK устройства, либо эмулятора, без необходимости повторного запуска CMake. 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.28/prop_tgt/IMPORTED_OBJECTS.html

Spec-Zone.ru

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