こんにちは。きんくまです。
今回は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
Static Libraryを作る
共有化するStatic Libraryを作ります。作り方は2つあります。
1. 既存のプロジェクトのtarget設定をStatic Libraryにする
2. はじめからStatic Libraryをつくる
順番に説明します。
1. 既存のプロジェクトのtarget設定をStatic Libraryにする
target設定からAdd Targetを選ぶ。左下のボタンです
iOSのFramework & Library > Cocoa Touch Static Libraryを選ぶ
target名はなんでもいいんですが、ここでは「もとのプロジェクトの名前」+ 「_lib」としました。
するとtargetに追加されます。
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の方に移しておきます。
build
ビルドします。ビルドは2回行います。release用とsimulator用です。
左上のプルダウンから、ライブラリの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ファイルを選択します。
今度は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には画像ファイルを含められない
とか。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ