Hello World

GNUstep logo

まずは、Objective-Cによって書かれたHello Worldプログラムを実行することを目標とします。

Hello Worldのソースコード

以下のコードをhello.mとして保存します。 Objective-Cのソースファイルは拡張子を「.m」とするのが通例となっているのでそれに習います。

#include <Foundation/Foundation.h>

int main(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Hello, world!");
    [pool release];
    return 0;
}

これが最小のObjective-C+GNUstepのコードというわけではありませんが、十分に短く、かつ、GNUstepの環境が整っていなければビルドできないので、テスト素材としてはちょうどよいです。

コンパイル

コンパイルとリンクを同時に行うことももちろん可能ですが、ここではわかりやすさのために分けて実行することにします。

gccでコンパイルだけを行うには、-cオプションをつけて実行します。

$ gcc -c source.m $(gnustep-config --objc-flags)

問題がなければ、オブジェクトファイルが生成されます。

$ ls
hello.d  hello.m  hello.o

拡張子が「.d」のhello.dは依存するヘッダファイルをMakeが認識するフォーマットでダンプされたものです。 このファイルはgccに-MMDオプションが与えられた場合に生成されます。

ここで、gnustep-configというツールを利用していることに注目します。 gnustep-config –objc-flagsというコマンドを単独で実行すると、コンパイルに必要なフラグが出力されます。

$ gnustep-config --objc-flags
-MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fconstant-string-class=NSConstantString -I. -I/home/freemikan/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep

この出力をgccのオプションとして利用するために、シェルのコマンド置き換えの機能を利用しています。 $(…) の代わりにバッククォート `…` にすることもできます。

$ gcc -c source.m `gnustep-config --objc-flags`

リンク

リンクもやはりgnustep-configの助けが必要になります。

$ gcc -o hello hello.o $(gnustep-config --base-libs)

GNUstepの環境に問題がなければ、gccに-o helloと指定したので、helloという名前の実行可能バイナリファイルが生成されているはずです。

$ ls
hello  hello.d  hello.m  hello.o

確かに実行可能バイナリファイルhelloが生成されています。 これを実行してみます。

$ ./hello
2025-05-20 21:43:34.036 hello[20105:20105] Hello, world!

「Hello, world!」の出力を確認することできました。 これで最初の目標は達成です。

gccに与える入力ファイルhello.oの位置は意味を持ちます。 例えば、次のようにしてしまうとリンクはパスしません。
$ gcc -o hello $(gnustep-config --base-libs) hello.o
gnustep-configのオプションには--objc-libsというものもあります。 しかし、今回はこれを使いません(使えません)。 gnustep-config --base-libsの出力には、-lgnustep-baseが含まれていて、まさにそれが必要だからです。

Objective-CとGNUstepの関係について

Objective-Cはもちろんプログラミング言語ですが、言語単独では極めて使い勝手が悪いです。 C言語のスーパーセットである(つまり、C言語として使うことができる)ことを除けば、ほとんど何もできないといってもいいくらいです。 AppleのObjective-Cによるプログラミングを支えるのはFoundationフレームワークとCocoaフレームワークであり、切り離すことは困難です。 GNUstepはFoundationフレームワーク及びCocoaフレームワークの代替となります。 LinuxでObjective-Cのプログラミングをする場合、GNUstep抜きではかなり厳しいのが現実です。 Objective-CとGNUstepが協調して初めて快適なプログラミング環境になります。

文書の編集
文書の先頭へ