[iPhone SDK] スタティックライブラリをターゲットに対応させてリンク
Three20のライブラリや,その他の外部ライブラリをプロジェクトでリンクするとき,そのターゲットが問題になる.
たとえば,ある自分のプロジェクトをターゲット,iphonesimulator-releaseでビルドしたものは,Three20のライブラリもiphonesimulator-releaseでビルドしたスタティックライブラリをリンクしないといけない.
このため.Debug版とRelease版を別々に用意して,ターゲット毎にリンク設定をかえないといけない.
Three20のようにソースコードで配布されているものは,iPhoneのSDKのバージョンがコロコロ変わる度々にビルドして使うことになる.そこで,ソースからビルドしたターゲット毎に異なるスタティックライブラリを,動的にかつ自動的にリンクできるようにXcodeを設定してみる.
./2tch/
./2tch/Three20/
上記のスクリーンショットのようにプロジェクトの中にThree20のソースコードフォルダを配置する.今回サンプルに2tchのプロジェクトを使ってみた.
Three20のプロジェクトを開いてビルドすると,ターゲットに応じて,バイナリが生成される.今回は,Debug版で,iphonesimulatorがターゲットなので,たとえば,下記のスクリーンショットのようにバイナリが生成される.
./2tch/
./2tch/Three20/
./2tch/Three20/build/Debug-iphonesimulator/
次にThree20をリンクさせたいプロジェクト(今回は2tch)を開いて,プロジェクトの設定を開き,
・リンク→他のリンクフラグ
・検索パス→ヘッダ検索パス
・検索パス→ライブラリ検索パス
の3つの項目を設定する.
このとき,全部のプロジェクト設定に反映させるために「構成」→「すべての構成」にしておく.そうでないと,現在の設定だけがターゲットになってしまう.
そして,それぞれの値を以下のようにセットする.
・リンク→他のリンクフラグ
-lObj -all_load -lThree20
・検索パス→ヘッダ検索パス
$(SRCROOT)/Three20/
・検索パス→ライブラリ検索パス
$(SRCROOT)/Three20/build/$(BUILD_STYLE)-$(PLATFORM_NAME)
これで,2tch側のプロジェクトでターゲットを設定すると,自動的にリンク先がかわるようになります.ただし,Three20のプロジェクトでそのターゲットでバイナリをビルドしておかないといけません.
また,プロジェクト設定の表示はきちんとリアルタイムで反映されないようです.
-all_loadのリンカオプションが抜けていたので,修正しました.