xcode4のフレームワークと静的ライブラリの違い、およびそれらを呼び出す方法


133

私はxcodeとObjective-Cにかなり慣れていません。非常に基本的な質問をしたいと思います。

プロジェクト設定で「バイナリをライブラリにリンク」すると、ワークスペースの他のプロジェクトからインポートされたフレームワークとライブラリに違いがあることがわかりました。

最初の質問、なぜフレームワークがあるのですか?そして、なぜ図書館があるのですか?ライブラリをフレームワークにすることはできませんか?

次に、.hファイルから、インポートした静的ライブラリからクラスを呼び出すにはどうすればよいですか?

接頭辞が必要だと思いますが、見つかりませんでした。「ProjName / Myclass.h」も機能していません。

できるだけ具体的にお願いします。

ありがとう


基本的な質問ではありません
Masih

回答:


140

静的ライブラリに対するフレームワークの最大の利点は、コンパイルされたライブラリバイナリと関連するヘッダーをパッケージ化するための優れた方法として機能することです。これらは、(FoundationやUIKitのようなSDKの組み込みフレームワークのように)プロジェクトにドロップでき、(ほとんどの場合)機能するはずです。

ほとんどのフレームワークには動的ライブラリが含まれています。Macフレームワークテンプレートを使用してXcodeで作成されたフレームワークは、動的ライブラリを作成します。iPhoneは動的フレームワークをサポートしていないため、iOSコードの再利用可能なライブラリを静的ライブラリとして配布することが一般的になっています。

静的ライブラリは問題ありませんが、ユーザー側で少し余分な作業が必要です。あなたは、ライブラリにプロジェクトをリンクする必要があり、あなたがあなたのプロジェクトにヘッダファイルをコピーする必要があるか、ビルド設定で適切なヘッダ検索パスを設定することで、どこかにそれらを参照します。

つまり、要約すると、私の意見では、ライブラリを配布する最良の方法はフレームワークとしてであるということです。iOSの「静的」フレームワークを作成するには、基本的に通常のフレームワークを使用して、バイナリをコンパイル済みの静的ライブラリに置き換えることができます。これが私が自分のライブラリーの1つであるRestyを配布する方法であり、今後自分のライブラリーを配布するつもりです。

そのプロジェクトで提供されているRakefileを確認することもできます(気付かない場合は、RakeはRubyのMakeに相当します)。プロジェクトをコンパイルし(を使用xcodebuild)、iOSの静的フレームワークとしてパッケージ化するためのいくつかのタスクがあります。これは便利なはずです。

または、これらのXcode 4テンプレートを使用してiOSフレームワークを作成することもできます。

2013年12月9日更新:これは人気のある回答なので、編集してライブラリ配布の最初の選択肢が変更されたと言ってみようと思いました。コンシューマーまたはプロデューサーとしてのサードパーティライブラリの最初の選択肢は、CocoaPodsです。CocoaPodsを使用してライブラリを配布し、ヘッダー付きのプリコンパイルされた静的ライブラリをフォールバックオプションとして提供しています。


1
したがって、ライブラリは静的でも動的でもよく、フレームワークは単にライブラリのグループであり、動的でも静的でもかまいませんが、それは正しい理解でしょうか。
トニー・

Xcodeフレームワークターゲットでは、ヘッダーをコピーすることもできますが、リソースをバンドルすることはできません。分散静的ライブラリにヘッダーを含めることはできますか?
トニー・

追加質問:デバッグまたは配布を使用してフレームワークを構築したかどうかは重要ですか?それ以外の場合、Distributionのフットプリントは小さくなります。
Aldrich Co

2
@GoRoSはい、そうです。実際、私はCocoaPodsを使用してプライベートSDKを利用可能にするクライアントのためにいくつかの作業を行いました。コツは、コンパイルされた静的ライブラリ、ヘッダー、ポッドスペックを指すパブリックレポと、ソースを含むプライベートレポです。理想的には、プライベートリポジトリをチェックアウトし、パブリックリポジトリをコンパイルして更新し、2つを同期させたままにするための、ある種のCI /自動化が必要です。タグを使用して、公開リポジトリ内の実際のバージョン付きリリースにタグを付けます(そしておそらく公開リポジトリ内にもあるため、公開リリースの作成に使用されたソースコミットがわかります)。
ルークレッドパス2015年

1
@LukeRedpath CIを使用したソリューションは非常に理想的です...それを設定する方法についてのチュートリアルがある良い記事/ブログについて知っていますか?Jenkinsが理想的
micromanc3r 2015

19

基本的に、フレームワークはライブラリであり、それらを操作するための便利なメカニズムを提供します。フレームワークの「内部」を見ると、それは静的ライブラリとヘッダーファイル(メタデータを含むフォルダ構造内)を含むディレクトリにすぎません。

独自のフレームワークを作成する場合は、「静的ライブラリ」を作成し、特定の方法でパックする必要があります。この質問を

一般に、プラットフォーム上のフレームワークは、「既存のフレームワークに」独自のコードを追加する再利用可能な動作に使用されます。特定の機能が必要な場合は、ライブラリ(例:three20)を使用して、配布可能なアプリにパックすることができます。


1
フレームワークに静的ライブラリが含まれている必要はないことに注意してください。実際、Mac OS Xでは、ほとんどのフレームワークに静的ライブラリが含まれていません。代わりに動的ライブラリが含まれています。

明らかですが、.mファイル内から静的ライブラリのクラスを呼び出すにはどうすればよいですか?「ライブラリとバイナリのリンク」を追加する以外に、#import "MyClass.h"を呼び出すだけで十分ですか?
Leonardo

@バラエティ正しいです私は「ライブラリ」だけを書いておくべきでした^^; それでも、ライブラリのないフレームワークはほぼすべてあります。ほとんどの場合、コンパイルするためにフレームワークにリンクし、ライブラリはターゲットシステムに存在します。これもまた、この動作と機能の
違い

@レオナルドはい、基本的にそれはあなたがしなければならないことです。.h-ファイルがパスのどこかにあることを確認してください。libarayのXCodeプロジェクトがある場合は、プロジェクトとそのターゲットを依存関係として含めることができるため、より多くのデバッグ機能と.hファイルをパスに含めることができます
Martin Ullrich

私は混乱しています。あなたの答えは正しいと思っていましたが、「-1」とマークされていました?!?!?!次に、ライブラリはワークスペースの一部であり、メインプロジェクトから正しくリンクされています。しかし、アプリケーションをビルドするときに「#import "MyClass.h"」行で「クラスが見つかりません」がまだ表示されます。私はそれを機能させるためのトリックがあることを知っています。
Leonardo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.