前回はクラスとメソッドを定義し、それをmain関数から呼び出すと言うことに。
前回までのソースは下記の通り。
// engine.m
#import <Foundation/NSObject.h>
#import <stdio.h>
@interface Engine : NSObject
- (void) startEngine;
@end
@implementation Engine
- (void) startEngine
{
printf( "Start my engine!\n" );
}
@end
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Engine alloc] init];
// EngineクラスのstartEngineメソッドを呼び出します
[obj startEngine];
return 0;
}
で、Cとかやってる人はわかると思うけど、ヘッダファイルが無いですね、と。。
まぁ、便宜上すっ飛ばしたんだけど、本当は必要。
と言うか、今のソースはそう言う意味でも非常によろしくない。。
と言うわけで、ヘッダとソースに分離しましょう、と。
ついでにメインとクラスのソースも分けて、分割コンパイルと言うのにも慣れてしまおうと言う魂胆。
まず、main.mとengine.m、engine.hを作る。
で、ディレクトリにまとめてスッキリさせることに。
mycar_prjと言うディレクトリを作ってその中にファイルを作った。
McLaren% pwd /Users/ユーザ名/Documents/source McLaren% ls -al total 16 drwxr-xr-x 4 ユーザ名 staff 136 10 23 15:03 . drwx------+ 27 ユーザ名 staff 918 10 14 17:36 .. -rw-r--r-- 1 ユーザ名 staff 449 10 23 15:03 engine.m -rw-r--r-- 1 ユーザ名 staff 80 10 14 17:47 test.m McLaren% mkdir mycar_prj McLaren% ls -al total 16 drwxr-xr-x 5 ユーザ名 staff 170 10 23 16:02 . drwx------+ 27 ユーザ名 staff 918 10 14 17:36 .. -rw-r--r-- 1 ユーザ名 staff 449 10 23 15:03 engine.m drwxr-xr-x 2 ユーザ名 staff 68 10 23 16:02 mycar_prj -rw-r--r-- 1 ユーザ名 staff 80 10 14 17:47 test.m McLaren% cd mycar_prj McLaren% ls -al total 0 drwxr-xr-x 2 ユーザ名 staff 68 10 23 16:02 . drwxr-xr-x 5 ユーザ名 staff 170 10 23 16:02 .. McLaren% touch main.m engine.m engine.h McLaren% ls -al total 0 drwxr-xr-x 5 ユーザ名 staff 170 10 23 16:04 . drwxr-xr-x 5 ユーザ名 staff 170 10 23 16:02 .. -rw-r--r-- 1 ユーザ名 staff 0 10 23 16:04 engine.h -rw-r--r-- 1 ユーザ名 staff 0 10 23 16:04 engine.m -rw-r--r-- 1 ユーザ名 staff 0 10 23 16:04 main.m
今やったのは、まずsourceディレクトリにmycar_prjと言うディレクトリを作った。
次に、そのディレクトリに移動してtouchと言うコマンドを打って、前述の3ファイルを生成。
touchと言うコマンドは、ファイルが無ければカラのファイルを作り、あれば最終更新日を更新すると言うコマンド。
何でもいいから空のファイルを作る時には最適やね。
で、まずengineクラスの定義部である.h(ヘッダ)ファイルを書く。
#import <Foundation/NSObject.h> @interface Engine : NSObject - (void) startEngine; @end
そんでもって、engineクラスの実装を.mファイルに書く。
ここでヘッダを呼び出しているところに注目。
#import "engine.h"
#import <stdio.h>
@implementation Engine
- (void) startEngine
{
printf( "Start my engine!\n" );
}
@end
さらにmain.mを書く。
ここでもengine.hを呼び出している。
#import "engine.h"
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Engine alloc] init];
// EngineクラスのstartEngineメソッドを呼び出します
[obj startEngine];
return 0;
}
これで作業は終わり。
では、複数に分かれたファイルをコンパイルする方法は下記の通り。
ヘッダファイルはソースコード内で呼び出しているので、引数に含める必要なし。
McLaren% gcc -o ../../exe/mycar main.m engine.m -framework Foundation McLaren% ../../exe/mycar Start my engine!
これで同じ実行結果が出たら成功。
失敗したらソースのどっかがおかしい。
ちなみに、オイラは1回失敗して直したw
では〜。