[iOS] XCode4.1でのStatic Libraryの作成と利用

2011/08/8

こんにちは。きんくまです。

今回はXCode4でのStatic Libraryについてです。
XCode3用や似たようなものがネット上に公開されてたりしたのですが、4.1ではうまくいかず。
現在のXCode4.1で動くものを調べるのに何日かかかりました、、。
なので、以下のものは現在のXCode4.1では動くのですが、これから先には動かなくなる可能性もあります。

Static Libraryとframework

どちらも、まとまったコードを別のプロジェクトでひっぱることができます。
だから、自分でよく使うコードや、似たプロジェクトで共有化できるコードなんかを
まとめておくと便利です。

Static Libraryと似たものにframeworkがあります。
iOSではAppleの用意したUIKit.frameworkなんかがあります。
これには、画像やらxibやらを含めることができます。
が、Mac OSの方ではframeworkを作るのが比較的楽のようですが、
iOSだとそうもいかず、それなりに難しいみたいです。

[Mac][iPhone][develop] iPhone OS用のほぼFrameworkの作り方

それで、今回は画像などのアセット関係は含められないけど、
ヘッダーファイルと実装ファイルを両方組み込めることのできるStatic Libraryについて
説明します。
ちなみに、Objective-C++(.mm)もきちんと動きました。

、、説明します。と書いておきながら、内容は全て下記リンク先をほぼそのままなぞっています。
不明点は下記リンク先の原文を参照してください。
これがなければ、できなかったです。ありがとうございますです。

>> Using Open Source Static Libraries in Xcode 4

workspaceを作る

workspacesの機能を使うことで、複数プロジェクトを1つのworkspaceで管理することができます。
空のworkspaceを作成
File > New > New WorkSpace

lib-fig1

Static Libraryを作る

共有化するStatic Libraryを作ります。作り方は2つあります。

1. 既存のプロジェクトのtarget設定をStatic Libraryにする
2. はじめからStatic Libraryをつくる

順番に説明します。

1. 既存のプロジェクトのtarget設定をStatic Libraryにする

target設定からAdd Targetを選ぶ。左下のボタンです

lib-fig2

iOSのFramework & Library > Cocoa Touch Static Libraryを選ぶ

lib-fig3

target名はなんでもいいんですが、ここでは「もとのプロジェクトの名前」+ 「_lib」としました。
するとtargetに追加されます。

lib-fig4

Build Settingsのところをこれからいじる必要があるのですが、次の項目のあとにまとめて説明します。

※参考 以下の方法だと実機用だとOKなのですが、simulator用でひっかかってしましました。
How to create universal static libraries on Xcode 4: the traditional way

2. はじめからStatic Libraryをつくる

File > New > New Projec > tiOSのFramework & Library > Cocoa Touch Static Library
から作成すれば1と同じです。

Build SettingsとBuild Phases

Build Settings

Deployment > Installation Directory > $(BUILT_PRODUCTS_DIR)
これで、ビルドした後にでき.aファイル(ファイル一覧の中のProductsにできます)を
このworkspace内の別のプロジェクトから参照することができます。

Linking > Other Linker Flags > -ObjC
XCode4だと最初からこうなっているかもしれません。XCode3だと違うみたいです。
ライブラリの中にObj-Cのカテゴリを使っている場合は
“-all_load” or “-force_load”を選ぶ必要があるかもとのことです。

Packaging > Public Headers Folader Path > $(TARGET_NAME)
これで、別のプロジェクトで#importで.hファイルが見えたり、コード補完がきくようになります。
コード補完や.hがもしうまく行かない場合は、すごーくアナログなんですが、ライブラリのヘッダーファイルを
目的のプロジェクト内にコピーする必要があるようです。
でも、自分のXCode4.1だとそれをしなくても今のところうまくいっているようです。

Build Phases

Compile Sourcesには実装ファイル(.mとか.mmとか)
Copy Headersにはヘッダーファイル(.h)を入れます。
もしかするとすでに入っているかもしれません。
Copy HeadersのところはPublic, Private, Projectとありますが
公開ファイルはProjectではなく、Publicの方に移しておきます。

lib-fig5

build

ビルドします。ビルドは2回行います。release用とsimulator用です。

lib-fig6

左上のプルダウンから、ライブラリのtarget名+iOS Deviceを選んでProduct > Build
ライブラリのtarget名+iPhone or iPad Simulatorを選んでProduct > Build
します。
これは、実機とsimulatorではCPUの種類が違うために、こういうことをしています。

※11/08/15追記 実際に利用していたら、どうやらtarget名+iOS Deviceのみのリビルドで
他のプロジェクトにうまく反映されています。だけど、うまくいかない場合は2回やる必要があるかも?

詳しくは
[iOS] Static Library (3) 複数のアーキテクチャへの対応は?

別のProjcetから利用する

別のプロジェクトのTARGETS設定を開いて
Build Phasesからさきほど作成した.aファイルを選択します。

lib-fig7

今度はBuild Settings を開いて
Search Paths > User Header Search Paths > $(BUILT_PRODUCTS_DIR)
にしてRecursiveにチェックを入れます。
これで、読み取り側の方からもLibraryのヘッダーファイルの情報が読み取れるようになりました。

これで、利用側のprojectからテストしてみるとうまくいくはずです。

※2012/06/17追記
ArchiveとDebug両方通すために、上の$(BUILT_PRODUCTS_DIR)の代わりに
$(SOURCE_ROOT)/../Libraryの名前
にしたらうまくいった。この方法なら、ヘッダーファイルをコピーする必要はなく便利。
>> 参照

※2011/08/22追記
Archive(Release)するときに、ビルドは通る(Build for Archive)のだけれど、
それらのファイルをまとめるとき(Archive)は、うまくいかずエラーが出てしまった。
なので、Static Libraryの.hファイル全部をコピーして、使う方のプロジェクトに
全部追加したところ、うまく行った。
この辺、どうやったらそんなことしなくていいのかよくわからない。
わかった人がもしいたら、コメント欄にでも書いてください。

注意点とか

・XCode3までの方法とやり方が変わっている
・Static Libraryには画像ファイルを含められない

とか。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る