Google

2014年9月13日土曜日

XCodeで静的ライブラリのリンクエラー:後編

前回の続き。

パスが追加されてて削除されないというのは解ったので、じゃあ具体的にどうするか。
元々やりたいことは以下でした。
  • 実機でもシミュレータでもリンクエラーを出さない
  • 可能な限り切り替えの手間を掛けたくない
  • 静的ライブラリを添付し直すとかは絶対無理
なんかXCodeの操作基礎勉強みたいになっちゃってますが、勉強不足だったので仕方なし。
昔のコンパイラと違ってXCodeのようなIDE構造が戸惑わせる部分は、ライブラリへの参照について以下の2つがあるという点じゃないでしょうかね。
  • 設定にサーチパスを指定する(伝統的)
  • プロジェクトにライブラリを追加する(D&D、近代的?)
XCodeプロジェクトはコマンドでビルドでき、その際にはビルドパスを指定したり直指定したりする点を考えると、後者はあくまでGUI上の便宜で存在しているはず。
それが前回のサーチパス自動追加という設計になっていると思われ。

と、ここまで来てふと気づいたことが。

パスが指定できるならビルドターゲットをもう一個作ってしまえいいのでは?
XCodeはスキームやターゲットを複数作って管理できるし、あ、それで即終わりかも。

という事で実験開始。

 やること:
  • プロジェクトのターゲットを複製
  • それぞれ、実機用とシミュレータ用とする
  • 前回設定したサーチパスは目的に合わせたパスを設定する
  • 切り替えてビルドテスト
まず最初にターゲットを複製します。
プロジェクト設定に行き、ターゲットの名前を右クリック。

Duplicateを選択します
一覧からDuplicateを選択すると"(元のターゲット名) copy"っていうターゲットが作成されます。
例えばTestProjectという名前の場合、TestProject copyがコピー時の名称です。
これは設定から後で修正も可能ですがテストなんでそのままにしてます。

コピーされました。
コピーすると、XCodeの最上部にあるスキーム設定から選択が可能になります。
これを切り替えるだけで簡単に使い分けができるという、、、要はXCodeの基礎の基礎でした。

ここの選択にcopyが追加され、選択可能になります。
今回は元々のものをiOS実機用、コピーした方をシミュレータデバッグ用としました。
で、それぞれにライブラリのサーチパスを設定します。

これらは前回の画像です。
元々の方は実機用ライブラリのパスを(例:Debug-iphoneosとあるパス)
シミュレータはそちらのパスになります。(例:Ddebug-iphonesimuratorとあるパス)
やり方は前回のようにグリっと*.aファイルをGUIに持って行っても構いません。
しかし静的ライブラリがそのままプロジェクトのGUIに存在したり混在していれば、XCodeはそれを参照してしまうため、どちらかのビルドは失敗します。
なので、もしD&Dでパスを自動設定するなら、設定し終わった後はプロジェクト階層にある*.aファイルは消去(または参照を解除)しましょう。

9/16追記:
大事なことを書き忘れていたので追記。
要はぐりっと持って行くことで、TARGETSのライブラリがこうなる訳です。



各ターゲット別に正しい静的ライブラリがRequiredになっているので、正常にリンクが通る訳ですね。
XCodeのバージョン相違による仕様ややり方によってはここに追加されない可能性があるかも知れませんので注意を。(未確認ですが)
追記終わり:

終わったら2つのターゲットをビルド実験します。
私の環境では、元々のターゲットはiOS実機用としました。

画像がでかくてすみません。実機ターゲットビルド結果です。
成功しました。
続いてコピーしたシミュレータのターゲット。

コピー側。ターゲットがシミュレータになっているのが左上で解るかと。
こちらも成功。
他にも方法はあるかと思いますが、とりあえず目的達成。
やっとこさ、デバッグ中の手間を緩和できそうです。

 まとめ:

  • ターゲットを増やしてそれぞれのライブラリパスを設定
  • プロジェクトのGUI上には*.aファイルは存在させない
  • あとは切り替えてビルドするだけ

よくよく考えてみればXCodeの元々の機能だし、サーチパス設定は当たり前だしで、やっぱり今更な結果。
ちゃんと機能を理解しないと以外なとこで足を引っ張られるものだと反省しました。

今回はこんなとこで。

0 件のコメント:

コメントを投稿