組み込みバイナリとリンクフレームワークの違いは何ですか


87

外部フレームワークを使用する場合、Xcodeには埋め込みバイナリリンクフレームワークセクションがあります。

ここに画像の説明を入力してください

外部フレームワークをダウンロードし、Finder-> Xcodeにドラッグすると、フレームワークが[リンクされたフレームワークとライブラリ]セクションに配置されます。

Carthageを使用してライブラリを構築する場合は、EmbeddedBinariesセクションにドラッグすることをお勧めします。

APIがどちらの方法でも利用できるようになると、どちらもリンケージの観点から機能しているように見えます。さらに、フレームワークをEmbedded Binariesセクションに追加すると、Linked Frameworks andLibrariesセクションにも自動的に追加されます。

それで、誰が正しいのですか?カルタゴまたはインターネットの残りの部分?Xcodeプロジェクトに外部リソースを含めるための2つのオプションがあるのはなぜですか?


また、デバイスでテストするときに機能しますか?
trojanfoe 2015

@trojanfoeはい、そうです。
Maxim Veksler 2015

1)埋め込みバイナリセクションにあるか、2)ビルド中にフレームワークをアプリバンドルにコピーするビルドステップがない限り、これは意味がありません。
trojanfoe 2015

2
Carthageは、OSXアプリケーションの場合のみ「EmbeddedBinaries」にドラッグすることをお勧めします。iOSの場合、「リンクされたフレームワークとライブラリ」のみを推奨します。
ダムナム2016年

回答:


72
  1. リンク-フレームワークで定義されているAPIを使用する場合は、フレームワークをリンクする必要があります。

  2. 埋め込み-このプロセスにより、追加されたフレームワークがアプリバンドル内に確実に埋め込まれ、アプリと拡張バンドルの間でコードを共有するのに役立つ可能性があります。サードパーティのフレームワークのみを組み込み、iOSが提供するフレームワークはデバイスですぐに利用できるため、組み込みません。埋め込む場合、つまり、Xcodeがコンパイルしてビルドを作成できるように、それらにもリンクする必要があります。アプリがデバイスで実行されると、必要に応じて組み込みフレームワークがメモリに読み込まれます。


1
「必要なとき」の部分とはどういう意味ですか?それは、実行時に必要なときに組み込みフレームワークがロードされることを意味しますか?また、動的フレームワークのリンクはいつ行われると思いますか?
bartosss 2018

それではembedなくlink、必要な場合はありますか?およびその逆?なぜ?
allenlinli

APIをコードで直接使用するフレームワークをリンクするだけでよいと思います。アプリケーションコードで参照されていない推移的な依存関係は、私が正しければ埋め込む必要があります。
WernerAltewischer19年

15

バイナリを埋め込むと、製品に含まれます。ライブラリまたはフレームワークを埋め込まずにリンクするだけの場合、それは製品の一部にはなりません。

ただし、iOS8では、すべてのサードパーティフレームワークを「埋め込む」必要があります。さまざまなプログラム間で共有されるフレームワークでさえ、それらのプログラムのすべてに「埋め込む」必要があります。共有場所のデバイスにインストールされた場合、共有場所からの同じ「埋め込み」コードを使用する他のインストールプロセスは、その既存のインストールを再利用できます。これはiOS8に固有であり、iOS8の前には不可能であり、iOSの世界以外ではこの答えは正確ではありません。


2
「バイナリを埋め込むと、ユーザーがマシンにそのようなものをまだインストールしていない場合に、ユーザーが製品を簡単にインストールできるようになります」iOSではなくOSXのように聞こえます...ライブラリがない場合インストールされている(つまり、非標準である)場合、アプリは単にロードされません。
trojanfoe 2015

それはロードされないだけでなく、@ trojanfoe、拒否され、そもそもインストールできませんでした(開発者であるか、エンタープライズアカウントを使用していない限り...)
dogsgod 2015

iOS 8
Basti 2015

ユーザーがアプリをインストールし、そのアプリに動的にリンクされたフレームワークが含まれている場合、そのフレームワークを自動的に検索できます。ただし、これはユーザーのインストールプロセス中に失敗し、アプリケーションを終了するリンク編集エラーを発生させる可能性がある追加のポイントです。したがって、答えがOS Xにのみ適用され、iOSには適用されない理由はわかりません。私の答えに関して改善の余地があると思われる場合は、より具体的にお願いします。または、答えがすでに正確であると思われる場合は、仲間の開発者を完全なSOメンバーにするために、その答えに賛成してください;)
Basti 2015

私が反対するのは、あなたの答えに対するオプションの側面です。フレームワークがサードパーティの場合は、アプリバンドルの一部である必要があります。限目。これはOSXアプリにもほぼ当てはまります(確かにMac App Store経由で配布されるアプリの場合)。
trojanfoe 2015

0

Linkingこれについての詳細はLinker、コンパイル時またはロード/実行時に機能します。Linker コピーLibrary対象のバイナリに。以来Framework自律的で、Linkerこの場合には、検索のための責任があるとリンクDynamic Framework内のシステム・ローダー・パスの内側または検索するとリンクバンドル

Embeddingバイナリをターゲットバイナリにコピーするプロセスです。結果として、それは内部に配置されます。

詳細はこちら


-3

私の理解では、埋め込みバイナリにはiOS 8以降で使用可能な動的フレームワークのみが含まれています。それ以外の場合は、静的なフレームワークのみをリンクできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.