Objective-Cのお勉強 #2 ファイルの分割とコンパイル


前回はクラスとメソッドを定義し、それを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

では〜。

Post to Twitter

, , , ,

  1. No comments yet.
(will not be published)