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.31/prop_tgt/IMPORTED_OBJECTS.html