Cocoaアプリでライブラリを使用する方法
CocoaアプリケーションのプロジェクトにC/C++で作成しているStaticLibraryプロジェクトやCocoaFrameworkを組み込む方法についてです。開発環境はXcode 4です。
まず実行ファイルの出力先を相対パスに設定しておきます。
Xcode>Preferences>Locations>Derived Data>Relative
StaticLibrary用プロジェクトの作成
File>New>New Project>MacOSX>Framework&Library>C/C++Library>Next>ProductNameに名称入力"StaticLibForCocoa", Type:Static>プロジェクトのパスを指定、"
/
プロジェクトにC++クラスを追加します
StaticLib.h
class StaticLib{ public: static void print(); };
StaticLib.cpp
#include "StaticLib.h" #include <stdio.h> void StaticLib::print(){ printf("Staticlib::print"); }
Cocoaアプリケーションプロジェクトの作成
File>New>New Project>MacOSX>Application>Cocoa Application>Next>ProductNameに名称入力"CocoaLibUse", Type:Static>プロジェクトのパスを指定、"
/
CocoaプロジェクトにStaticLibrary用プロジェクトを読み込ませる
File>Add Files To "CocoaLibUse">スタティックライブラリ用プロジェクトStaticLibForCocoa.xcodeprojを選択する>Add
これでCocoaLibUse.xcodeproj内にStaticLibForCocoa.xcodeprojが追加できます。
Staticライブラリ用プロジェクトのターゲットを追加する
Cocoaプロジェクトのビルドと同時にStaticライブラリ用プロジェクトもビルドされるように設定します
Product>Edit Scheme>Build>"+">StaticLibForCocoaを選択>Add
Staticライブラリ側のターゲットを追加することができました。
ライブラリを追加する
リンクするライブラリ一覧にlibStaticLibForCocoa.aを加えます。
CocoaLibUseのターゲットを選択>Build Phases>Link Binary With Libraries>"+">Workspace>"libStaticLibForCocoa.a"を選択>Add
Build Phases>TargetDependencies>"+">StaticLibForCocoaを選択>Add
Staticライブラリのヘッダインクルードパスを設定する
ヘッダStaticLib.hへのパスを通します。
CocoaLibUseのターゲットを選択>Build Settings>Search Paths>Header Search Paths>ターゲットの項目をクリック>"+">Recursiveにチェックを入れる>Pathに"../StaticLibForCocoa"を入力
Staticライブラリを利用する
ファイルをObjective-C++に対応させるために拡張子を.mmにかえます。(CocoaLibUseAppDelegate.m→CocoaLibUseAppDelegate.mmに変更)
さらにCocoaLibUse内のヘッダファイルの拡張子を.hhに変更します。
CocoaLibUseAppDelegate.h→CocoaLibUseAppDelegate.hh
(ライブラリ側のヘッダと".hh"をインルードしているobjective-cのヘッダは全て.hhに変更)
StaticLib.hをimportして、StaticLibクラスを利用します。呼び出し側のコードはC++スタイルで記述します。
CocoaLibUse.mm
#import "CocoaLibUseAppDelegate.hh" #import "StaticLib.h" @implementation CocoaLibUseAppDelegate @synthesize window; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { StaticLib::print(); } @end
最後にビルド・実行して
Staticlib::print
がコンソールに表示されれば成功です。
次にカスタムCocoaFrameworkを別プロジェクトから使用する手順です。
CocoaFrameworkプロジェクトの作成
File>New>New Project>MacOSX>Framework&Library>CocoaFramework>Next>ProductNameに名称入力"MyCocoaFramework",プロジェクトのパスを指定、"
/
プロジェクトにObjective-Cクラスを追加する
MyCocoaFramework.h
@interface MyCocoaFramework : NSObject +(void)API; @end
MyCocoaFramework.m
#import "MyCocoaFramework.h" @implementation MyCocoaFramework +(void)API { NSLog(@"MyCocoaFramework API was called."); } @end
CocoaFrameworkの利用
Cocoaプロジェクトに作成したFrameworkプロジェクトを読み込ませます。
File>Add Files To "CocoaLibUse">スタティックライブラリ用プロジェクトMyCocoaFramework.xcodeprojを選択する>Add
CocoaLibUse.xcodeproj内にMyCocoaFramework.xcodeprojが追加されます。
Staticライブラリ用プロジェクトのターゲット・ライブラリを追加する
先ほどと同様に
Product>Edit Scheme>Build>"+">MyCocoaFrameworkを選択>Add
さらに
CocoaLibUseのターゲットを選択>Build Phases>Link Binary With Libraries>"+">Workspace>"MyCocoaFramework.framework"を選択>Add
Staticライブラリのヘッダインクルードパスを設定する
CocoaLibUseのターゲットを選択>Build Settings>Search Paths>Header Search Paths>ターゲットの項目をクリック>"+">Recursiveにチェックを入れる>Pathに"../MyCocoaFramework"を入力
frameworkを利用する
CocoaLibUseAppDelegateからMyCocoaFrameworkを呼び出してみます。
CocoaLibUseAppDelegate.m
#import "CocoaLibUseAppDelegate.h" #import "MyCocoaFramework.h" @implementation CocoaLibUseAppDelegate @synthesize window; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [MyCocoaFramework API]; } @end
最後にビルド・実行して
MyCocoaFramework API was called.
がコンソールに表示されれば成功です。