MacBook Air を注文したことだし、Objective-C のプログラミングでもやってみようかと手を出した。コンパイル環境は Ubuntu Linux 12.10 (MacBook Air はまだ届いていない)。基本、C の拡張ということで甘く見てた。そして一手目からコケた。
- 拡張子は何?
- コンパイラーは何?
- Makefile はどう書くの?
- 必要なライブラリーは?
Hello, World を出力するまでを記事にする。
インストール
libc6-dev をインストールするために build-essential パッケージを、Objective-C 用のライブラリーをインストールするために gobjc パッケージをインストールする。
$ sudo apt-get install build-essential $ sudo apt-get install gobjc
ソースコード
#include
の代わりに#import
を使う- Objective-C では objc/Object.h のインポートが必須 (Cocoa 開発の場合を除く)
#import は #include と違って二重読み込みをしない仕様とのこと。
Hello, World を出力するプログラムはこちら。
#import <objc/Object.h>
#import <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
main 文の引数を空にすべきか、void にすべきか悩む... ANSI C の上位互換なら void にすべきか? これを拡張子 .m で保存する。
Makefile
GNU Makefile では、Objective-C をデフォールトでサポートしていないのね。implicit variables や implicit rules が使えなくて驚いた。
Objective-C のコンパイラーは gcc を使えば良いらしいけど、変数名を CCC
とするか OBJC
にするか二通りの流儀があるらしい。CCC
は昔、C++ のコンパイラー変数として使われていたこともあるので、後者を選ぶ。
必須ライブラリー objc
を呼ぶことを忘れずに書いた Makefile (最小) は以下の通り:
#
# Makefile for hello
#
TARGET = hello
OBJC = gcc
OBJCFLAGS = -W -Wall
LIB = -lobjc
all: $(TARGET)
$(TARGET): main.o
$(OBJC) $(OBJCFLAGS) $^ $(LIB) -o $@
%.o: %.m
$(OBJC) $(OBJCFLAGS) -c $< -o $@
#
# clean
#
RM = rm -f
clean:
$(RM) *~
$(RM) *.o
distclean: clean
$(RM) $(TARGET)
最後に make コマンド実行でコンパイル終了。
$ make gcc -W -Wall -c main.m -o main.o gcc -W -Wall main.o -lobjc -o hello
あとがき
今回のコードは、Objective-C のコードを一行も書いていない。C のソースコードを、Objective-C のやり方に則ってコンパイルしただけ。まだまだ勉強することは多い。
調べてると、Objective-C++ とか Objective-C 2.0 とか言語が進化してるし、gcc は事実上 GNUstep 専用と化し、Mac では LLVM ベースにシフトしているとか。一歩一歩勉強しよ。
No comments:
Post a Comment