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 устройства, либо 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/prop_tgt/IMPORTED_OBJECTS.html