iOSで静的ライブラリを使う
Objective-CとC++の両方を混在させてみます。※(注)環境はiOS SDK4.3, Xcode4.1, 動作確認はシミュレータのみ
Static Library用プロジェクトを作成する
File>New>NewProject>iOS>Framework & Libraries>CocoaTouch>StaticLib.xcodeprojを/
→/
/
test.h
#ifndef _test_h #define _test_h class Sample{ public: void test(); }; #endif
test.cpp
#include "test.h" #include <stdio.h> void Sample::test(){ printf("Sample::test was called\n"); }
C++を記述するソースの拡張子を.mmに修正、C++で記述されたヘッダをインクルードしているObjective-Cのヘッダを.hhに修正します。
StaticLib.h→StaticLib.hhにする
#import <Foundation/Foundation.h> @interface StaticLib : NSObject -(void)test; @end
StaticLib.m→StaticLib.mmにする
#import "StaticLib.hh" #import "test.h" @implementation StaticLib - (id)init { self = [super init]; if (self) { } return self; } -(void)test { NSLog(@"[StaticLib test] was called\n"); Sample sample; sample.test(); } @end
ビルドするとlibStaticLib.aが作成されます。
ライブラリを使用するプロジェクトを作成する
File>New>NewProject>iOS>Applications>適当に選択>StaticLibUse.xcodeprojを作成
→/
File>Add Files to "StaticLibUse.xcodeproj"> StaticLib.xcodeprojのパスを選択>Add
StaticLibUse.xcodeprojに入れ子状にStaticLib.xcodeprojが追加される
StaticLibUse.xcodeprojのTARGET>Build Phases>Link Binary With Libaries>"+">libStaticLib.a>Doneでライブラリを追加
同様にTarget Dependency>"+">StaticLibでプロジェクトの依存関係を追加
Edit Scheme>Build>"+">StaticLibでビルド対象となるターゲットStaticLibを追加
StaticLibUse.xcodeprojからtest.h,StaticLib.hを読み込むためにインクルードパスを設定します。例えば"/
StaticLibUse.xcodeproj選択>TARGET>Build Settings>Serach Headers>"+">ヘッダパス入力 再帰検索ならRecursiveにチェック>Done
ライブラリを使用する
C++を使うので同様にStaticLibUseAppDelegate.mの拡張子をmmに変更しておきます。
StaticLibUseAppDelegate.mm
#import "StaticLibUseAppDelegate.h" // その他デフォルトのヘッダ→略 // ライブラリのヘッダインクルード #import "test.h" #import "StaticLib.h" @implementation StaticLibUseAppDelegate // メンバ、メソッド定義→略 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { Sample sample; sample.test(); StaticLib* staticLib = [[StaticLib alloc]init]; [staticLib test]; [staticLib release]; // 略 return YES; }
以上で、Objective-CとC++の両方のIFを呼び出すことができます。実行して両方とも呼び出されれば成功です。
Sample::test was called [StaticLib test] was called Sample::test was called