iOSで静的ライブラリを使う

Objective-CC++の両方を混在させてみます。※(注)環境はiOS SDK4.3, Xcode4.1, 動作確認はシミュレータのみ

Static Library用プロジェクトを作成する

File>New>NewProject>iOS>Framework & Libraries>CocoaTouch>StaticLib.xcodeprojを/に作成
→//StaticLib/StaticLib.xcodeprojというプロジェクトが作成される
//StaticLib/StaticLib/test.h,test.cppを作成してプロジェクト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を作成
→//StaticLibUse/StaticLib.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を読み込むためにインクルードパスを設定します。例えば"//StaticLib/StaticLib"
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-CC++の両方のIFを呼び出すことができます。実行して両方とも呼び出されれば成功です。

Sample::test was called
[StaticLib test] was called
Sample::test was called