Дополнительный Xcode Sdk — Что Это Такое И Почему Он Вам Не Нужен

Apple приносит в мир много нового.

Успешные инновации приживаются, а неудачные постепенно вымирают. Кстати, неудачных решений не так уж и мало и я считаю это абсолютно нормальным.

В конце концов, мы уважаем Apple именно за готовность рисковать и экспериментировать :) Все это в полной мере относится и к инструментам разработки.

В прошлом примечание Я писал о нестандартном алгоритме поиска заголовочных файлов в XCode. Сегодня я хочу подробнее остановиться на так называемом SDK — в XCode этот термин используется для описания набора библиотек и заголовочных файлов для конкретной версии iOS или Mac OS. Зачем нам нужен SDK для понимания xCode?

  • Каждый SDK лежит в своей отдельной папке и органично сосуществует с другими SDK — это позволяет вести разработку под разные ОС на одном компьютере.

    Раньше SDK располагались в папке /Developer/SDKs; к четвертой серии xCode они переместились внутрь xCode.app.

  • Настроить проект для конкретной версии ОС очень просто.

    Достаточно указать SDK в настройках проекта.

Технически это реализуется следующим образом.

Apple добавила в компилятор ключ --sysroot. Значение sysroot добавляется в качестве префикса к пути для поиска файлов заголовков и библиотек.

Этому изменению подлежат как стандартные пути (например: /usr/include), так и пользовательские пути, добавленные с помощью ключей -I и -L. Это работает следующим образом.

Допустим, в настройках XCode выбран SDK macosx10.6. XCode передает ключ --sysroot=/Developer/SDKs/MacOSX10.6.sdk компилятору.

В результате /usr/include становится /Developer/SDKs/MacOSX10.6.sdk/usr/include. То же самое происходит и с путями поиска библиотек и фреймворков.

Как нетрудно догадаться, внутри SDK есть usr/include и usr/lib с соответствующим содержимым.

Теперь пришло время перейти к загадочной опции «Дополнительные SDK» в XCode. Почему это необходимо? Допустим, вы — компания, производящая промежуточное программное обеспечение.

Вы упаковываете свои библиотеки и платформы в виде XCode SDK. Чтобы использовать свое промежуточное ПО в проекте, просто укажите полный путь к вашему SDK в разделе «Дополнительные SDK» в настройках XCode. Заголовочные файлы и библиотеки становятся доступными автоматически.

Кстати, вы можете использовать множество дополнительных SDK одновременно.

К сожалению, как это часто бывает, красивая идея разрушается в результате ее реализации.

Для поддержки дополнительных SDK XCode приходится проделывать много дополнительной работы, что приводит к замедлению сборки проекта.

Для каждой используемой комбинации базового и дополнительных SDK во временной папке создается объединенное дерево файлов всех SDK, а путь к этой папке передается в --sysroot. Вместо честного копирования файлов используются симлинки, но все равно процесс не быстрый.

Для желающих поэкспериментировать с Дополнительным SDK я подготовил проект на гитхабе.

Взгляните на SDKSettings.plist. Этот файл необходим XCode для «распознавания» SDK. В своих проектах я не использую Дополнительный SDK и вместо этого вручную настраиваю пути для поиска заголовков, библиотек и фреймворков.

Бонус: версии SDK и ОС.

Для каждой новой версии ОС выпускается новый SDK. Однако это не означает, что проект, скомпилированный с помощью SDK macosx10.8, будет работать только в Mac OS X 10.8 и не будет работать в более ранних ОС.

Версия SDK 10.8 означает, что SDK включает в себя все API, доступные в Mac OS X 10.8 и ранее системы (за исключением устаревшего API).

Если в проекте не используются возможности, отсутствующие в OS X 10.6, то проект без проблем запустится на 10.6. Более интересная ситуация, когда мы используем новые возможности, если они доступны, и используем альтернативную реализацию для старых систем.

Для этого используется слабая связь.

«Слабо связанная» может быть как целой динамической библиотекой, так и отдельной функцией из динамической библиотеки.

Если при запуске не удается найти слабослинкованную библиотеку, программа продолжит выполнение как ни в чем не бывало, а компоновщик подставит NULL в адрес недостающих функций.

Конечно, если вы вызовете несуществующую функцию, программа выйдет из строя.

Поэтому перед вызовом мы сравниваем адрес функции с NULL, и если функция недоступна, используем альтернативную реализацию.

Минимальная поддерживаемая версия Mac OS указана в настройках проекта (MACOSX_DEPLOYMENT_TARGET).

Все более поздние API автоматически помечаются как слабые ссылки.

Это делается с помощью макросов, объявленных в /usr/include/Availability.h. Теги: #xcode #sdk #xcode sdk #дополнительный xcode sdk #программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.