Платформы и слабое соединение
Одна проблема, столкнутая разработчиками, является проблемой использования в своих интересах новых функций, представленных в новых версиях OS X при тихой поддержке более старых версий системы. Обычно, если приложение использует новую функцию в платформе, это неспособно работать на более ранних версиях платформы, не поддерживающих ту функцию. Когда попытка использовать функцию была предпринята, таким приложениям или не удалось бы запуститься или отказать. Apple решил эту проблему путем добавления поддержки слабо соединенных символов.
Когда символ в платформе определяется, как слабо соединено, символ не должен присутствовать во время выполнения для процесса, чтобы продолжать работать. Статический компоновщик идентифицирует слабо соединенный символ как таковой в любом модуле кода, это ссылается на символ. Динамический компоновщик использует эту ту же информацию во время выполнения, чтобы определить, может ли процесс продолжать работать. Если слабо соединенный символ не присутствует в платформе, модуль кода может продолжать работать, пока это не ссылается на символ. Однако, если символ присутствует, код может обычно использовать его.
При обновлении собственных платформ необходимо считать делающие новые символы слабо соединенными. Выполнение так может упростить для клиентов Вашей платформы поддерживать его. Необходимо также удостовериться, что собственный код проверяет на существование слабо соединенных символов перед использованием их.
Для получения дополнительной информации относительно слабого соединения, включая дополнительные примеры, посмотрите Руководство по совместимости SDK.
Слабое соединение и платформы Apple
Платформы Apple используют макросы доступности, чтобы определить, соединяется ли символ слабо или строго соединяется. Apple обертывает новые интерфейсы в свои платформы с макросами доступности для указания, какая версия операционной системы функция сначала появилась. Макросы также используются для указания устаревших функций и интерфейсов.
Макросы доступности, определенные в /usr/include/AvailabilityMacros.h
добавьте слабую информацию о соединении к системным интерфейсам на основе версий OS X Ваши поддержки проекта. При создании нового проекта Вы говорите компилятор, какие версии OS X Ваш проект поддерживает путем поставления цель развертывания и целевой SDK в XCode. Компилятор использует эти настройки для присвоения надлежащих значений MAC_OS_X_VERSION_MIN_REQUIRED
и MAC_OS_X_VERSION_MAX_ALLOWED
макросы, соответственно. Для получения информации о том, как изменить эти настройки в XCode, см. “Установку Кросс-разработки в XCode” в Руководстве по совместимости SDK или справке XCode.
Например, предположите в XCode, Вы ставите цель развертывания (минимальная требуемая версия) к OS X v10.2 и целевой SDK (максимальная позволенная версия) к OS X v10.3. Во время компиляции компилятор слабо соединил бы любые интерфейсы, представленные в версии 10.3 OS X при сильном соединении более ранних интерфейсов. Это позволило бы Вашему приложению продолжать работать на версии 10.2 OS X, но все еще использовать в своих интересах более новые функции, когда они доступны.
Перед использованием любых символов, представленных в версии OS X, который является позже, чем Ваша минимальная требуемая версия, удостоверьтесь, что Вы проверяете, чтобы видеть, что символ существует сначала. Посмотрите Используя Слабо Соединенные Символы для получения дополнительной информации.
Отмечание символов для слабого соединения
При определении собственных платформ можно отметить символы как слабо соединенное использование weak_import
атрибут. Слабое соединение является особенно надлежащим при представлении новых функций существующей платформе. Для маркировки символов, как слабо соединено необходимо удостовериться, что среда сконфигурирована для поддержки слабого соединения:
Необходимо использовать версию 3.1 GCC или позже. Слабое соединение не поддерживается в версии 2.95 GCC
Необходимо установить Развертывание OS X опция сборки Target проекта XCode к OS X v10.2 или позже.
Компоновщик отмечает символы, как строго соединено, если Вы явно не говорите его иначе. Для маркировки функции или переменной, как слабо соединено добавьте weak_import
припишите прототипу функции или объявлению переменной, как показано в следующем примере:
extern int MyFunction() __attribute__((weak_import)); |
extern int MyVariable __attribute__((weak_import)); |
Используя слабо соединенные символы
Если Ваша платформа полагается на слабо соединенные символы в каком-либо Apple или сторонних платформах, необходимо проверить на существование тех символов перед использованием их. При попытке использовать несуществующий символ без первой проверки, динамический компоновщик может генерировать ошибку привязки во время выполнения и завершить соответствующий процесс.
Если слабо соединенный символ не доступен в платформе, компоновщик устанавливает адрес в NULL символа. Можно проверить этот адрес в код с помощью кода, подобного следующему:
extern int MyWeakLinkedFunction() __attribute__((weak_import)); |
int main() |
{ |
int result = 0; |
if (MyWeakLinkedFunction != NULL) |
{ |
result = MyWeakLinkedFunction(); |
} |
return result; |
} |
Слабое соединение со всеми платформами
При ссылке на символы в другой платформе большинство тех символов соединяется строго с кодом. Для создания слабой ссылки к символу платформа, содержащая символ, должна явно добавить weak_import
припишите ему (см. отмечающие Символы для Слабого Соединения). Однако, если Вы не поддерживаете платформу и потребность соединить ее символы слабо, можно явно сказать компилятору отмечать все символы, как слабо соединено. Чтобы сделать это, необходимо открыть проект в XCode и изменить способ, которым цели соединяются с платформой следующим образом:
Выберите цель, Вы хотите изменить и показать ее фазы сборки.
Разверните Двоичный файл Ссылки С фазой сборки Библиотек для просмотра платформ, в настоящее время соединяемых к установленному сроку.
Если платформа, с которой Вы хотите слабо соединиться, перечислена в Двоичном файле Ссылки С фазой сборки Библиотек, выберите его и выберите Edit> Delete для удаления его.
Теперь можно сказать компоновщику использовать слабое соединение для той платформы.
Выберите цель, откройте ее окно Info и нажмите Build.
К Другой установке сборки Флагов Компоновщика добавьте следующую спецификацию параметра командной строки, где
<framework_name>
имя платформы, с которой Вы хотите слабо соединиться:-weak_framework <framework_name>
Создайте свой продукт.
-weak_framework
опция говорит компоновщику слабо соединять все символы в именованной платформе. Если необходимо соединиться с библиотекой вместо платформы, можно использовать -weak_library
команда компоновщика вместо -weak_framework
.