В чем разница между встроенными двоичными файлами и связанными платформами

87

При использовании внешней структуры Xcode теперь имеет раздел Embedded Binaries, а также раздел Linked Frameworks .

введите описание изображения здесь

Когда вы загружаете внешний фреймворк и Finder-> перетаскиваете его в Xcode, он помещает фреймворк в раздел « Связанные фреймворки и библиотеки ».

Когда вы создаете библиотеку с помощью Carthage, рекомендуется перетащить ее в раздел Embedded Binaries .

Оба, похоже, работают с точки зрения связывания, поскольку API становится доступным в любом случае, а при добавлении фреймворка в раздел встроенных двоичных файлов он также автоматически добавляется в раздел связанных фреймворков и библиотек .

Итак, кто прав? Карфаген или остальной Интернет? и почему есть 2 варианта включения внешних ресурсов в проекты Xcode?

Максим Векслер
источник
А при тестировании на аппарате работает?
Trojanfoe
@trojanfoe да, это так.
Максим Векслер
Это не имеет смысла, если только он 1) не находится в разделе встроенных двоичных файлов или 2) не содержит шаг сборки для копирования фреймворка в пакет приложения во время сборки.
Trojanfoe
2
Carthage рекомендует перетаскивать во «Встроенные двоичные файлы» только для приложений OSX. Для iOS они рекомендуют только «Связанные платформы и библиотеки».
Damnum 02
Возможный дубликат Link Binary с библиотеками VS Embed Frameworks
Suhaib

Ответы:

72
  1. Связывание - мы должны связать фреймворк, если мы используем какой-либо определенный в нем API.

  2. Встраивание - этот процесс гарантирует, что добавленная структура будет встроена в пакет приложения, и потенциально поможет обмениваться кодом между приложением и любыми пакетами расширений. Мы встраиваем только сторонние фреймворки, а не те, которые предоставляются iOS, поскольку они легко доступны на устройстве. Если мы внедряем, это означает, что нам также нужно будет связать с ними, чтобы Xcode мог скомпилировать и создать сборку. Когда приложение запускается на устройстве, встроенная структура будет загружена в память при необходимости.

Шрипада
источник
1
Что вы имеете в виду под частью «когда необходимо»? Означает ли это, что встроенный фреймворк загружается, когда это необходимо во время выполнения? Кроме того, как вы думаете, когда произойдет связывание динамического фреймворка?
bartosss 01
Нужен ли нам случай, embedа не linkон? Наоборот? И почему?
allenlinli 08
Я думаю, вам нужно только связать фреймворки, API которых вы используете непосредственно в коде, транзитивные зависимости, которые не упоминаются в коде приложения, должны быть просто встроены, если я прав.
Werner Altewischer
15

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

Однако в iOS8 все сторонние платформы должны быть «встроены». Даже структура, которая является общей для различных программ, должна быть «встроена» в каждую из этих программ. В случае, если он был установлен на устройстве в совместно используемом месте, любой другой процесс установки с использованием того же «встроенного» кода из совместно используемого места может повторно использовать эту существующую установку. Это характерно для iOS8, до iOS8 это было невозможно, и за пределами мира iOS этот ответ не будет точным.

Basti
источник
2
«Встраивание двоичного кода упростит установку вашего продукта для пользователя, если у них еще нет работающей установки этого материала на своих машинах» звучит как OSX, а не iOS ... если у них нет библиотеки установлено (т.е. нестандартно), приложение просто не загружается.
Trojanfoe
он не только не загрузится, @trojanfoe, он будет отклонен, и вы не сможете установить его в первую очередь (если вы не являетесь разработчиком или не используете учетную запись Enterprise ...)
doggod
Динамически связанные фреймворки возможны с iOS 8
Басти
Когда пользователь устанавливает ваше приложение и если это приложение включает в себя динамически подключаемую платформу, поиск этой платформы может выполняться автоматически. Однако это дополнительная точка, которая может выйти из строя во время процесса установки пользователя, вызывая ошибку редактирования ссылки, которая завершает работу приложения. Поэтому я не вижу причин, по которым ответ должен применяться только к OS X, а не к iOS. Пожалуйста, будьте более конкретны, если вы видите, что мой ответ можно улучшить. Или проголосуйте за этот ответ, чтобы сделать другого разработчика полноправным участником SO, если вы думаете, что ответ уже точен;)
Басти
Я возражаю против необязательного аспекта вашего ответа. Если фреймворк является сторонним, он должен быть частью пакета приложения. Период. Это также во многом верно и для приложений OSX (конечно, для приложений, распространяемых через Mac App Store).
trojanfoe
0

Linkingбольше об Linkerэтом работает во время компиляции или загрузки / выполнения. Linker скопироватьLibrary в целевой двоичный файл. Поскольку Frameworkявляется автономным, Linkerв этом случае он отвечает за поиск и связывание Dynamic Frameworkвнутри пути системного загрузчика или за поиск и связывание внутри пакета .

Embeddingэто процесс копирования двоичного файла в целевой двоичный файл. В результате он окажется внутри.

Подробнее здесь

yoAlex5
источник
-3

Насколько я понимаю, встроенный двоичный файл включает только динамическую структуру, доступную в iOS 8 и выше, в противном случае вы можете связать только статическую структуру.

Лэй Чжан
источник