2013-04-03

初めての Objective-C (in Ubuntu Linux)

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