忍者ブログ
ちょっとは人のためになる事をしないとインターネットコミュニティーの皆様に申し訳がないかと思いながら、自分の備忘録ていどでしかなく、実際の所たいした情報も提供できないでいるブログ
[103] [102] [101] [100] [98] [97] [96] [94] [93] [92] [91]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Xcode 4.2 で iOS のスタティックライブラリを作り、自分で利用する
スタティックライブラリとアプリケーションは別のプロジェクトとする。

せっかちな人用

ライブラリを使う側:
  • スタティックライブラリのプロジェクトの .xcodeproj を、プロジェクトに追加する。
  • ターゲットの Target Dependencies および Link Binary With Libraries に対象のライブラリを追加する。
  • プロジェクトレベルの Build Settings の Header Search Paths に下記を追加
    $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/usr/local/include
    $(INSTALL_ROOT)/usr/local/include

ライブラリ側:
  • 公開したいヘッダーファイルの属性を変更する。File Inspector の Target Membership のチェックボックスをチェックかつPublic に変更する。



一般的な考慮事項

ライブラリを利用する場合、

  • コンパイル時にライブラリが提供する定義が入ったヘッダーをインクルード
  • リンク時にライブラリファイルをリンク

の二点が必要になる。前者はコンパイラーの -I オプションに関する設定であり、後者はリンカーの -L のディレクトリ指定、-lのライブラリ指定に関わる設定だ。
両者を適切に設定しないと、コンパイルできない(.hが見つからない)、リンクできない(未定義シンボル)といったトラブルになる。

スタティックライブラリの作成方法

プロジェクト作成時に、Cocoa Static Library を選択する。ここまでは簡単。

ライブラリの名前のつけ方に注意。
Unix系のライブラリは libなんとか.a というファイル名とするのが慣例で、この名前にするために、プロジェクト名は、「なんとか」の部分だけを指定する。

例えば、libpicture.a を作ろうとしている場合、Xcode でのプロジェクト名は "picture" だけを指定する 。"libpicture"などと指定すると、liblibpicture.a が作られてしまい気持ちが悪い。あとで修正するのも面倒だ。

Xcode プロジェクトにライブラリのプロジェクトを追加する。

アプリケーションのプロジェクトに、スタティックライブラリの .xcodeproj ファイルを追加する。追加するのは .xcodeproj であり、スタティックライブラリプロジェクトのディレクトリではない。
  • "File" "Add Files To ..."で出てくるダイアログで .xcodeproj ファイルを指定して "Add" する。
  • この作業で、プロジェクトの中にライブラリのプロジェクトが包含され、以下の手順で、ライブラリが選択可能になる。
    プロジェクトナビゲーターはこんなかんじになる。

    ここでは "usesample アプリケーション" のプロジェクトに "sample スタティックライブラリ"のプロジェクトを追加した。
  • ただし、これだけでは、インクルードもできないしリンクもしない。下記の手順が必要。

スタティックライブラリがヘッダーファイルを公開する方法

スタティックライブラリは、ライブラリ関数のプロトタイプや各種定義類が入ったヘッダーファイルを提供する。automake/autoconfを使う場合は make install で /usr/local/include などにコピーするのだが、アーキテクチャの違う iOS ライブラリをそのような場所にコピーする訳にもいかない。

Xcodeでは少し変わったビルド方法をとっている。公開するヘッダーファイルをプロジェクト内の領域(DerivedData下)にヘッダーファイルをコピーして、依存関係のあるプロジェクトでヘッダーファイルを参照する仕組みだ。

公開したいヘッダーファイルを Project Navigator(⌘1)で選択し、File Inspector(Option+⌘+1)のTarget Membershipでライブラリターゲットのメンバーとするよう、チェックを入れる
また、Target Membership の "Project" となっている部分を Public に変更する。
  • ヘッダーファイルはデフォルトでは Target Membership が off になる。
  • また、ライブラリプロジェクト以外では、ヘッダーファイルの Target Membership を on にできない。

  • この操作により、ヘッダーファイルが DerivedData 下のビルドディレクトリにコピーされ、別プロジェクトから利用できるようになる。

スタティックライブラリが公開したヘッダーファイルをインクルードする設定。

プロジェクト内の領域(DerivedData下)にコピーされたヘッダーファイルを利用できるように設定する。ライブラリを使用するターゲットの "Header Search Path" に下記の2行を追加する。

$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/usr/local/include
$(INSTALL_ROOT)/usr/local/include
(2011/10/18追記: Archive時、これがないと include が見つからない)

検索ボックスで "header search" と入れると見つけやすい。設定項目の表示が Basic だと出ないので注意。
プロジェクトレベルの Header Search Paths に、本設定を追加しても良い。

依存関係および、リンク対象とする設定を行う

アプリケーションの Target の Build Phases を開く。

Target Dependencies に、利用したいスタティックライブラリを追加する。

  • こんなかんじ
  • この作業で、アプリケーション Target をビルドする前にライブラリのソースファイルの依存関係がチェックされ、必要なら再ビルドされる。
  • この依存関係は .c -> .o -> .a を再構成するだけでなく、ヘッダーファイルの変更にも影響する。リンクしないがヘッダーファイルをインクルードする場合(スタティックライブラリが別のスタティックライブラリを利用しているようなケース)でも、この依存関係を設定する必要がある。
  • Target Depencency を適切に設定していないと、オブジェクトファイルの変更が、ターゲットアプリケーションに反映されないだけでなく、ヘッダーファイルの変更までも無視されてビルド・デバッグが混乱するので要注意。
  • 完成されたライブラリなど、変更されないライブラリなら、依存関係を設定する必要はない。
Link対象となるように設定する

Link Binary With Libraries に、リンクしたいライブラリを追加する。
  • これでアプリケーションにライブラリがリンクされる。
  • こんなかんじになる

以上。
これで複数プロジェクトに分かれたスタティックライブラリ・アプリケーション間でコンパイル、リンクがスムーズに通るようになるはずだ。

PR

コメント
参考になりました。
参考になりました。有難うございます。
【2012/09/18 10:37】 NAME[とおりすがり] WEBLINK[] EDIT[]


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
09 2019/10 11
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
フリーエリア
最新CM
[02/07 @naoshi65536]
[02/07 忍]
[09/18 とおりすがり]
[06/26 ilmare]
[03/16 とおりすがり]
最新TB
プロフィール
HN:
naoshi
性別:
男性
職業:
ソフトウェア技術者
趣味:
料理
自己紹介:
@naoshi65536 で連絡がつくはずです。
バーコード
ブログ内検索
カウンター
アクセス解析
FX NEWS

-外国為替-