強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iPhoneとシミュレータで使用するライブラリを分ける方法

以前、こちらのエントリーでiPhone用のSDLのビルドについて解説したのですが

実はあの方法のままだとこのような warning が出たりします。

warning: in lib/libSDLSimulator.a, file is not of required architecture

こちらの warning は実際の動作には問題ないのですが少々気持ち悪いので修正しました。

エラー文を確認したところおそらくリクエストしたアーキティクチャに合っていないライブラリを指定しているために発生しているのだと思われました。

そこでリンクするライブラリを「Frameworks」ディレクトリに追加する方法ではiPhone向けとシミュレータの両方でリンクされてしまうのでその代わりにコンパイル時のオプションとしてシミュレータ用SDKでのビルド時のみリンクする様に指定することで解決するだろうと予測してその方法を調査したところ以下の資料を見つけました。

iPhone Development Guide: Configuring Applications
http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/115-Configuring_Applications/configuring_applications.html#//apple_ref/doc/uid/TP40007959-CH19-SW7

こちら、大体は自分が希望していた情報なのですが拡張子が .framework (動的にリンクするライブラリ)の場合のときの説明なのでそのまま libSDLSimulator.a をリンクする方法には適用できませんでした。

.a (静的にリンクするライブラリ)についてのリンク方法の記述はXcodeが実際に設定しているオプションから調べました。
具体的は方法としては以下の手順を行いました。

1. ビルドを実行。
2. 「ビルド結果」ウィンドウの赤いマークを付けた部分のボタンを押す。
※表示されてない場合は Command+Shift+B で表示できます。

すると以下の様にビルド方法の詳細が表示されます。

3. その中から libSDLSimulator.a や libSDLiPhoneOS.a がどのように指定してあるか、該当箇所を見つけます。

すると -lSDLSimulator -lSDLiPhoneOS という記述が見つかりました。
そのためオプションは -l でライブラリ名は先頭の lib の記述と拡張子を削除したものを指定するのではないかと思われました。

そのため .framework 向けの設定を応用して以下の様に設定したところ warning が解消されました。

今回はシミュレータ向けのライブラリがiPhone向けビルドのときに問題を起こした。
そのためシミュレータ向けのライブラリはシミュレータ向けのビルドのときだけリンクする様にして対応しました。

同様にiPhone向けビルドのときだけライブラリをリンクしたい場合はターゲットのSDKiPhone向けSDKを選択することにより設定できます。