2016年4月11日月曜日

Raspberry PI, GNUStepのプライベートフレームワーク作成/使用方法メモ

Raspberry PIでプライベートフレームワークを作成/使用する方法のメモ
フレームワークの作成は手順通りだが、プライベートフレームワークとして使用する際にはリンカオプションなどいくつかコツがいる。

環境:Raspberry PI2, GNUStep, ProjectCenter

以下、HelloWorld.frameworkを作成し、プライベートフレームワークとして使用する例

<GNUStep統合開発環境のProjectCenterを準備する>

1.ProjectCenterをインストール
sudo apt-get install gnustep-devel



<HelloWorld.frameworkの作成>

1.ProjectCenterを起動
Menu > Programming > ProjectCenter


2.新規プロジェクトでFrameworkを作成する
PC > Project > New..を選択
Project Types > Frameworkを選択
フレームワークの名称を付けてOK(ここではHelloWorldとする。)


3.HelloWorldを実装する
Classes > HelloWorld.mに好きなコードを書く
ここでは以下のようにする

#import "HelloWorld.h"

@implementation HelloWorld

- (void)helloWorld
{
NSLog(@"HelloWorld: HelloWorld!!");
}

@end


4.HelloWorld.frameworkをビルドする
Project Builder > Build でビルド
プロジェクトフォルダ内にHelloWorld.frameworkが作成されていればOK。


<HelloWorld.frameworkの使用>

1.ProjectCenterを起動
Menu > Programming > ProjectCenter


2.新規プロジェクトでApplicationを作成する
PC > Project > New..を選択
Project Types > Applicationを選択
アプリの名称を付けてOK(ここではHelloWorldDemoとする。)


3.HelloWorldDemoを実装する
Classes > AppController.mでHelloWorld.hをインポートし、好きなコードを書く
ここでは以下のようにする

#import "AppController.h"
#import "HelloWorld.h"

@implementation AppController

- (void) applicationDidFinishLaunching: (NSNotification *)aNotif
{
HelloWorld *helloWorld = [[HelloWorld alloc] init];
[helloWorld helloWorld];
NSLog(@"HelloWorldDemo: %@", [NSBundle bundleForClass:[MLHelloWorld class]]);
}

@end


4.プロジェクトにHelloWorldフレームワークを追加する
Projectパネル内のLibrariesを選択した状態で、Project > Add Files..を選択
先ほどビルドしたHelloWorld.frameworkの中にあるlibHelloWorld.soを選択
(HelloWorld.frameworkではなく.soを選択しなければならない)
Librariesの一覧が、
gnustep-base
gnustep-gui
HelloWorld
となっていればOK。

※この時、GNUmakefile.preamble内に、リンカオプションとして
ADDITIONAL_GUI_LIBS += -lHelloWorld
が自動的に追加される。


5.プロジェクトのその他のリソースとしてHelloWorldフレームワークを追加する
Projectパネル内のOther Resourcesを選択した状態で、Project > Add Files..を選択
先ほどビルドしたHelloWorld.frameworkを選択

※この時、HelloWorldDemoプロジェクトフォルダ内にあるResourcesフォルダにHelloWorld.frameworkが自動的にコピーされる


6.ヘッダファイルのインクルードパスを追加する。
Project Inspector > Header Directory Search Orderを選択
./Resources/HelloWorld.frameworks/Headers と入力
※この時、GNUmakefile.preamble内に、リンカオプションとして
ADDITIONAL_INCLUDE_DIRS += -I./Resources/HelloWorld.framework/Headers
が自動的に追加される。
※これはビルド時にヘッダファイルを検索するフォルダの指定である


7.実行時のフレームワーク検索のためのリンカオプションを追加する
Project Inspector > Linker Flagsの欄に以下を追加する
-Wl,-R'$$ORIGIN/Resources/HelloWorld.framework/Versions/0.1'

※-Wl-R'path' は、実行ファイルに共有ライブラリの検索パスを追加するオプション
※$ORIGINは、ビルド後の実行ファイルの絶対パスを意味する。
※$$ORIGINの最初の$はエスケープ文字で、2つめの$を文字として扱う
※パスはシングルクォーテーションで囲わなければならない
※HelloWorld.framework内にあるシンボルリンクでは動作しなかったので、Versions/バージョン番号フォルダまで指定する必要がある
※5の操作で、ビルド後、HelloWorld.framework一式は、HelloWorldDemo.app > Resourcesフォルダ内にコピーされる。そのため、-Wl,-Rのパスは上記のようになる。


8.HelloWorldDemoをビルドする
Project Builder > Build でビルド
プロジェクトフォルダ内にHelloWorldDemo.appが作成されていればOK。


9.HelloWorldDemoを起動して確認する
起動してHelloWorld!!が表示されればOK

※NSLog(@"HelloWorldDemo: %@", [NSBundle bundleForClass:[MLHelloWorld class]]);の結果の末尾が、"HelloWorldDemo.app/Resources/HelloWorld.framework"となっていれば、プライベートフレームワークとして機能している。


ところで、ProjectCenterは設定に従って、ファイルの作成やコピー、makeファイルの自動生成を主に行う。特に以下のmakeファイルが設定によって頻繁に更新されるので、直接操作する場合は注意が必要。直接操作後にProjectCenterを開くと、もとの状態に戻る可能性がある。
GNUmakefile
GNUmakefile.preamble
GNUmakefile.postamble

参考:
http://industriousone.com/topic/linking-linux
http://wagavulin.hatenablog.com/entry/20091026/1256577635



0 件のコメント: